通过Servlet 3.0以编程方式控制登录

| 我已经在Glassfish 3.0.1中测试了默认的安全容器,得出的结论是,我不会再花时间在上面。相反,我想自己控制验证。但是我需要一些指导以使我步入正轨。 目前,我有一个具有登录/注销功能的UserBean(请参见下文)。而且我不想使用内置在容器中的* j_security_check *,而是使用核心JSF 2.0。 我的问题是; 如果用户未登录(如果访问某些文件夹),是否需要ServletFilter来重定向流量? 用户成功登录后,如何存储用户密码? 感谢任何帮助或链接到示例,问候克里斯。 PS。对不起,我将两个问题聚在一起
@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()
时,您实际上应该已经在代表用户数据库的容器中配置了一个Realm。但是您似乎已用2英镑代替了Realm。在这种情况下,
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!)
}
当这样进行身份验证时,您肯定需要一个过滤器来限制访问。使用容器管理的安全性时,通常将其指定为“ 6”中的“ 5”。但是没有它,您必须将其掌握在手中。很高兴知道,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登录页面问题(以及在Glassfish中配置领域) 使用j_security_check在Java EE / JSF中执行用户身份验证     
        请注意是否正在使用JDBC领域安全性。在Glassfish管理控制台中配置领域的字段中有一些固定/预期的词。 在JAAS Context:字段中,您必须输入:jdbcRealm。此关键字使安全性容器使用预期的JDBC领域。如果您输入其他内容,它将无法正常工作。 这是戈登·朱戈(Gordan Jugo)做的一个很好的例子。 Netbeans / Glassfish JDBC安全领域     

要回复问题请先登录注册