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_username
danj_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 User
pengambil untuk memeriksa apakah User
sudah masuk dan jika tidak, lalu periksa apakah Principal
ada dalam permintaan dan jika demikian, maka dapatkan yang User
terkait 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 User
jelas diakses di JSF EL oleh #{auth.user}
.
Untuk keluar, lakukan a HttpServletRequest#logout()
(dan setel User
ke nol!). Anda bisa mendapatkan pegangan HttpServletRequest
di 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_check
yang mungkin tidak dapat dijangkau oleh operator di beberapa server servlet. Dalam hal ini, Anda bisa menggunakan formulir JSF yang layak dan kacang dengan username
dan password
properti dan login
metode 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 User
ini dapat diakses di JSF EL oleh #{user}
.