Security 如何在配置了SHA-256安全域的情况下使用HttpServletRequestlogin()编程登录

Security 如何在配置了SHA-256安全域的情况下使用HttpServletRequestlogin()编程登录,security,jsf,jsf-2,glassfish-3,servlet-3.0,Security,Jsf,Jsf 2,Glassfish 3,Servlet 3.0,我已经读过,我正在使用配置了sha-256摘要算法的glassfish 3.1.1安全域。有关于这个的教程吗?可能我正在呼啸,我正在尝试使用以下代码登录: public void login() throws NoSuchAlgorithmException { FacesContext context = FacesContext.getCurrentInstance(); HttpServletRequest request = (HttpServletRequest)con

我已经读过,我正在使用配置了sha-256摘要算法的glassfish 3.1.1安全域。有关于这个的教程吗?可能我正在呼啸,我正在尝试使用以下代码登录:

public void login() throws NoSuchAlgorithmException {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();

    EntityManager em = emf.createEntityManager();
    boolean committed = false;
    try {
        FacesMessage msg = null;
        EntityTransaction entr = em.getTransaction();
        entr.begin();
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(password.getBytes());
            byte byteData[] = md.digest();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < byteData.length; i++) {
                sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
            }
            password = sb.toString();
            Query query = em.createQuery("SELECT COUNT(u) FROM EntityUser u WHERE u.userName = :userName AND u.password = :password")
                    .setParameter("userName", userName).setParameter("password", password);
            long result = (long)query.getSingleResult();
            if (result == 1) {
                request.login(userName, password);
                msg = new FacesMessage();
                msg.setSeverity(FacesMessage.SEVERITY_INFO);
                msg.setSummary("You are logged in");
            }
            entr.commit();
            committed = true;
        } catch (ServletException e) {
            context.addMessage(null, new FacesMessage("wrong username or password"));
        }
        finally {
            if (!committed) entr.rollback();
        }
    } finally {
        em.close();
    }
}

结果变量返回1,但request.loginuserName、password;if条件中的方法总是抛出servletexception。

登录失败的原因可能很多。您刚刚检查了表中是否有适当的用户和密码。Glassfish在身份验证过程中对两个表进行两次查询。一个是指定为userTable的表,另一个是在安全域定义中确定的groupTable。检查web.xml和glassfish-web.xml是否正确。

登录失败的原因很多。您刚刚检查了表中是否有适当的用户和密码。Glassfish在身份验证过程中对两个表进行两次查询。一个是指定为userTable的表,另一个是在安全域定义中确定的groupTable。检查web.xml和glassfish-web.xml是否正确。

您能发布异常堆栈跟踪吗?这样就更容易理解异常的来源。但是从您当前提供的代码来看,您应该提供

request.login(userName, password);
密码应为纯文本密码,而不是哈希密码

Interface HttpServletRequest
ServletException - if the configured login mechanism does not support username password
authentication, or if a non-null caller identity had already been established (prior to 
the call to login), or if validation of the provided username and password fails.

你能发布异常stacktrace吗?这样就更容易理解异常的来源。但是从您当前提供的代码来看,您应该提供

request.login(userName, password);
密码应为纯文本密码,而不是哈希密码

Interface HttpServletRequest
ServletException - if the configured login mechanism does not support username password
authentication, or if a non-null caller identity had already been established (prior to 
the call to login), or if validation of the provided username and password fails.

被质疑的问题完全是关于方法的

request.loginuserName,密码

作者把一切都做对了,甚至他自己使用用户数据库的身份验证方式,但request.login需要设置身份验证域,以供此方法使用。而且你有自己的,你不需要单独的请求。登录验证。在你需要的情况下——你就是这样做的

因此,在得到结果=1后,设置context.getExternalContext.getSessionMap.putuser,u; 并发送重定向context.getExternalContext.redirectcontext.getExternalContext.getRequestContextPath+ªааа-ªааааааааа

并使用webfilter在不登录的情况下阻止对/Pages/*.xhtml的访问

@WebFilter("/Pages/*")
    public class LoggingFilter implements Filter {

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse res = (HttpServletResponse)response;
            User user = (User) req.getSession().getAttribute("user");         
            if(user != null){
                chain.doFilter(request,response);
            }  
            else res.sendRedirect(req.getContextPath()+"/запрос_учетных_данных.xhtml");
        }

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }

        @Override
        public void destroy() {
        }
    }

被质疑的问题完全是关于方法的

request.loginuserName,密码

作者把一切都做对了,甚至他自己使用用户数据库的身份验证方式,但request.login需要设置身份验证域,以供此方法使用。而且你有自己的,你不需要单独的请求。登录验证。在你需要的情况下——你就是这样做的

因此,在得到结果=1后,设置context.getExternalContext.getSessionMap.putuser,u; 并发送重定向context.getExternalContext.redirectcontext.getExternalContext.getRequestContextPath+ªааа-ªааааааааа

并使用webfilter在不登录的情况下阻止对/Pages/*.xhtml的访问

@WebFilter("/Pages/*")
    public class LoggingFilter implements Filter {

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse res = (HttpServletResponse)response;
            User user = (User) req.getSession().getAttribute("user");         
            if(user != null){
                chain.doFilter(request,response);
            }  
            else res.sendRedirect(req.getContextPath()+"/запрос_учетных_данных.xhtml");
        }

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }

        @Override
        public void destroy() {
        }
    }

我已经可以通过glassfish表单身份验证登录。我想登录程序。我已经可以用glassfish表单身份验证登录了。我想登录程序。我也有同样的问题:表单身份验证j_安全检查实际上有效,但调用request.login则无效。你怎么解决的?我没解决。我不再使用jsf了,我有同样的问题:表单身份验证j_安全检查实际上可以工作,但是调用request.login不行。你怎么解决的?我没解决。我不再使用jsf了