Tôi cho rằng bạn muốn xác thực dựa trên mẫu bằng cách sử dụng các mô tả triển khai và j_security_check
.
Bạn cũng có thể thực hiện điều này trong JSF bằng cách chỉ sử dụng cùng tên trường được xác định trước j_username
và j_password
như được trình bày trong hướng dẫn.
Ví dụ
<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>
Bạn có thể lười tải trong User
getter để kiểm tra xem User
đã đăng nhập chưa và nếu không, sau đó kiểm tra xem Principal
nó có trong yêu cầu không và nếu có, thì hãy User
liên kết với 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;
}
}
Các User
rõ ràng là dễ tiếp cận trong JSF EL bằng #{auth.user}
.
Để đăng xuất, hãy thực hiện HttpServletRequest#logout()
(và đặt User
thành null!). Bạn có thể xử lý HttpServletRequest
trong JSF bằng cách ExternalContext#getRequest()
. Bạn cũng có thể làm mất hiệu lực phiên hoàn toàn.
public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "login?faces-redirect=true";
}
Đối với phần còn lại (xác định người dùng, vai trò và các ràng buộc trong mô tả triển khai và lĩnh vực), chỉ cần làm theo hướng dẫn Java EE 6 và tài liệu của người phục vụ theo cách thông thường.
Cập nhật : bạn cũng có thể sử dụng Servlet 3.0 mới HttpServletRequest#login()
để thực hiện đăng nhập theo chương trình thay vì sử dụng j_security_check
mà có thể không truy cập được bởi một người điều phối trong một số trình điều khiển dịch vụ. Trong trường hợp này, bạn có thể sử dụng một biểu mẫu JSF đầy đủ và một bean với username
và password
các thuộc tính và một login
phương thức giống như sau:
<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>
Và khung nhìn này được quản lý trong phạm vi được quản lý cũng nhớ trang được yêu cầu ban đầu:
@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.
}
Bằng cách User
này, có thể truy cập được trong JSF EL #{user}
.