मुझे लगता है कि आप तैनाती के विवरणों का उपयोग करके प्रपत्र आधारित प्रमाणीकरण चाहते हैं और ।j_security_check
जेएसएफ में आप केवल उसी पूर्वनिर्धारित क्षेत्र के नाम का उपयोग करके भी कर सकते हैं j_username
और j_password
जैसा कि ट्यूटोरियल में दिखाया गया है।
उदाहरण के लिए
<form action="j_security_check" method="post">
<h:outputLabel for="j_username" value="Username" />
<h:inputText id="j_username" />
<br />
<h:outputLabel for="j_password" value="Password" />
<h:inputSecret id="j_password" />
<br />
<h:commandButton value="Login" />
</form>
आप में आलसी लोड हो रहा है कर सकता है User
, तो जाँच करने के लिए गेटर User
यदि पहले ही और यदि नहीं लॉग होता है, तो जाँच Principal
अनुरोध में मौजूद है और अगर ऐसा है, तो हो User
के साथ जुड़े j_username
।
package com.stackoverflow.q2206911;
import java.io.IOException;
import java.security.Principal;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@SessionScoped
public class Auth {
private User user; // The JPA entity.
@EJB
private UserService userService;
public User getUser() {
if (user == null) {
Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
if (principal != null) {
user = userService.find(principal.getName()); // Find User by j_username.
}
}
return user;
}
}
User
जाहिर द्वारा JSF ईएल में पहुँचा जा सकता है #{auth.user}
।
लॉगआउट करने के लिए एक HttpServletRequest#logout()
(और User
नल करने के लिए सेट !)। आप HttpServletRequest
JSF में से एक हैंडल प्राप्त कर सकते हैं ExternalContext#getRequest()
। आप सत्र को पूरी तरह से अमान्य भी कर सकते हैं।
public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "login?faces-redirect=true";
}
अवशेष (उपयोगकर्ताओं, भूमिकाओं और परिनियोजन वर्णनकर्ता और दायरे में परिभाषित करने के लिए) के लिए, बस जावा ईई 6 ट्यूटोरियल और सर्वलेट प्रलेखन का सामान्य तरीके से पालन करें।
अद्यतन : आप नए सर्वलेट 3.0 HttpServletRequest#login()
का उपयोग करने के बजाय एक प्रोग्रामेटिक लॉगिन करने के लिए भी कर j_security_check
सकते हैं, जो कुछ सर्वलेटकनेक्टर्स में डिस्पैचर द्वारा प्रति-से-पहुंच योग्य नहीं हो सकता है। इस मामले में आप एक fullworthy JSF फार्म और के साथ एक सेम का उपयोग कर सकते username
हैं और password
गुण और एक login
तरीका है जिसके इस तरह दिखेगा:
<h:form>
<h:outputLabel for="username" value="Username" />
<h:inputText id="username" value="#{auth.username}" required="true" />
<h:message for="username" />
<br />
<h:outputLabel for="password" value="Password" />
<h:inputSecret id="password" value="#{auth.password}" required="true" />
<h:message for="password" />
<br />
<h:commandButton value="Login" action="#{auth.login}" />
<h:messages globalOnly="true" />
</h:form>
और यह दृश्य प्रबंधित बीन को हटा दिया गया, जो शुरू में अनुरोधित पृष्ठ को भी याद करता है:
@ManagedBean
@ViewScoped
public class Auth {
private String username;
private String password;
private String originalURL;
@PostConstruct
public void init() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
originalURL = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
if (originalURL == null) {
originalURL = externalContext.getRequestContextPath() + "/home.xhtml";
} else {
String originalQuery = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_QUERY_STRING);
if (originalQuery != null) {
originalURL += "?" + originalQuery;
}
}
}
@EJB
private UserService userService;
public void login() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
try {
request.login(username, password);
User user = userService.find(username, password);
externalContext.getSessionMap().put("user", user);
externalContext.redirect(originalURL);
} catch (ServletException e) {
// Handle unknown username/password in request.login().
context.addMessage(null, new FacesMessage("Unknown login"));
}
}
public void logout() throws IOException {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
externalContext.redirect(externalContext.getRequestContextPath() + "/login.xhtml");
}
// Getters/setters for username and password.
}
इस तरह से User
JSF EL में पहुँचा जा सकता है #{user}
।