Если вы хотите использовать request.login()
, тогда вы действительно должны настроить Realm в контейнере, который представляет пользовательскую базу данных.Но вы, кажется, заменили Царство каким-то AuthenticationFacade
.В этом случае request.login()
вам не нужен.
Вам нужно просто поместить пользователя в область сеанса и перехватить его.Вот начальный пример:
@ManagedBean
@SessionScoped
public class UserManager {
@EJB
private UserService userService;
private String username;
private String password;
private User current;
public String login() {
current = userService.find(username, password);
if (current == null) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unknown login, try again"));
return null;
} else {
return "userhome?faces-redirect=true";
}
}
public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "index?faces-redirect=true";
}
public boolean isLoggedIn() {
return current != null;
}
// Getters/setters (but do NOT provide a setter for current!)
}
Когда вы берете аутентификацию в руки, как это, вам определенно необходим фильтр для ограничения доступа.При использовании безопасности, управляемой контейнером, для этого обычно указывается значение <url-pattern>
из <security-constraint>
.Но без этого вы должны взять это в свои руки.Полезно знать, что управляемые bean-компоненты JSF вводятся с помощью имени управляемого bean-компонента в любой области.
UserManager userManager = ((HttpServletRequest) request).getSession().getAttribute("userManager");
if (userManager == null || !userManager.isLoggedIn()) {
((HttpServletResponse) response).sendRedirect("login.xhtml");
} else {
chain.doFilter(request, response);
}
Сопоставьте вышеуказанный фильтр с нужным URL-шаблоном.
Когда выЕсли вы все еще хотите пересмотреть использование аутентификации, управляемой контейнером, тогда могут быть полезны следующие связанные ответы: