Saya kira Anda ingin otentikasi berbasis formulir menggunakan deskriptor penyebaran dan j_security_check .
Anda juga dapat melakukan ini di JSF hanya dengan menggunakan nama bidang j_usernamedanj_password seperti yang ditunjukkan dalam tutorial.
Misalnya
<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>
Anda dapat melakukan pemuatan malas di Userpengambil untuk memeriksa apakah Usersudah masuk dan jika tidak, lalu periksa apakah Principalada dalam permintaan dan jika demikian, maka dapatkan yang Userterkait dengannya 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;
}
}
The Userjelas diakses di JSF EL oleh #{auth.user}.
Untuk keluar, lakukan a HttpServletRequest#logout()(dan setel Userke nol!). Anda bisa mendapatkan pegangan HttpServletRequestdi JSF dengan ExternalContext#getRequest(). Anda juga dapat membatalkan sesi secara keseluruhan.
public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "login?faces-redirect=true";
}
Untuk yang tersisa (mendefinisikan pengguna, peran, dan kendala dalam penerapan descriptor dan ranah), cukup ikuti tutorial Java EE 6 dan dokumentasi servletcontainer dengan cara biasa.
Pembaruan : Anda juga dapat menggunakan Servlet 3.0 baru HttpServletRequest#login()untuk melakukan login terprogram alih-alih menggunakan j_security_checkyang mungkin tidak dapat dijangkau oleh operator di beberapa server servlet. Dalam hal ini, Anda bisa menggunakan formulir JSF yang layak dan kacang dengan usernamedan passwordproperti dan loginmetode yang terlihat seperti ini:
<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>
Dan tampilan ini mencakup kacang yang dikelola yang juga mengingat halaman yang awalnya diminta:
@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.
}
Dengan cara Userini dapat diakses di JSF EL oleh #{user}.