我已经测试了 Glassfish 3.0.1 中的默认安全容器,得出的结论是我不会再花时间在这上面了。相反,我想自己控制验证。但我需要一些指导才能让我走上正轨。

目前我有一个具有登录/注销功能的 UserBean(见下文)。而且我不想使用 *j_security_check* 内置容器,而是使用核心 JSF 2.0。

我的问题是;

  • 如果用户未登录(如果访问某些文件夹),我是否需要 ServletFilter 来重定向流量?
  • 用户成功登录后如何存储用户价格?

  • 感谢任何帮助或示例链接,问候克里斯。

    附注。请原谅我将两个问题聚集在一起
    @ManagedBean 
    @SessionScoped 
    public class UserBean { 
     
    private AuthenticateUser authenticateUser; 
    ... 
     
    public String login() { 
        FacesContext context = FacesContext.getCurrentInstance(); 
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 
     
        JsfUtil.log("Username : " +authenticateUser.getUserName()); 
        JsfUtil.log("Password : " +authenticateUser.getPassword()); 
        AuthenticateUser authRequest = authenticationFacade.find(authenticateUser); 
        try { 
            if(!authRequest.equals(authenticateUser)) 
                return "/loginError"; 
     
            request.login(authenticateUser.getUserName(), authenticateUser.getPassword()); 
            return ""; 
        } catch(ServletException e){ 
           JsfUtil.addErrorMessage(e, "Incorrect username or password, please try again."); 
           return "/loginError"; 
        } 
     
    ... 
    public String logOut() { 
        String result = "/index?faces-redirect=true"; 
        FacesContext context = FacesContext.getCurrentInstance(); 
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 
     
        try { 
            request.logout(); 
        } catch (ServletException e) { 
            JsfUtil.log("Failed to logout user!" +e.getRootCause().toString()); 
            result = "/loginError?faces-redirect=true"; 
        } 
        return result; 
        } 
    

    请您参考如下方法:

    当您想使用时request.login() ,那么你应该真的在容器中配置了一个代表用户数据库的领域。但是你好像用一些AuthenticationFacade代替了Realm .在这种情况下,request.login()对你没用。

    您只需将用户放在 session 范围内并拦截它。这是一个启动示例:

    @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!) 
    } 
    

    当像这样进行身份验证时,您肯定需要一个 filter来限制访问。使用容器管理的安全性时,您通常会将其指定为 <url-pattern><security-constraint>为了这。但没有它,你必须把它掌握在你的手中。很高兴知道 JSF 托管 bean 在任何范围内都由它们的托管 bean 名称键控。
    UserManager userManager = ((HttpServletRequest) request).getSession().getAttribute("userManager"); 
     
    if (userManager == null || !userManager.isLoggedIn()) { 
        ((HttpServletResponse) response).sendRedirect("login.xhtml"); 
    } else { 
        chain.doFilter(request, response); 
    } 
    

    将上述过滤器映射到所需的 URL 模式。

    当您仍想重新考虑使用容器管理的身份验证时,以下相关答案可能有用:
  • Java EE Login Page Problem (和 Configuring Realm in Glassfish)
  • Performing user authentication in Java EE / JSF using j_security_check

  • 评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!