1

私はそこを読みました.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.login(userName, password); if 条件のメソッドは常に servletexception をスローします。

4

3 に答える 3

1

例外スタックトレースを投稿できますか? そうすれば、例外の原因を理解しやすくなります。しかし、現在提供されているコードから判断すると、

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.
于 2014-01-27T08:12:24.220 に答える
0

質問された問題は方法についての全体です

request.login(ユーザー名、パスワード);

作成者は、ユーザーデータベースを操作する独自の認証方法でさえ、すべてを正しくしましたが、この方法で使用するには、 request.loginで認証レルムを設定する必要があります。そして、あなたは独自のものを持っています。個別のrequest.login認証は必要ありません。あなたがそれを必要とする場合 - それはあなたがそれを行う方法です

したがって、result=1 を取得したら、context.getExternalContext().getSessionMap().put("user", u); リダイレクトを設定して送信 しますcontext.getExternalContext().redirect(context.getExternalContext().getRequestContextPath() + "какой-то модуль.xhtml");

ログインせずに /Pages/*.xhtml へのアクセスをブロックするには、webfilter を使用します。

@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() {
        }
    }
于 2017-01-08T14:03:38.630 に答える
0

ログインが失敗する理由はたくさんあります。適切なユーザーとパスワードがテーブルにあるかどうかを確認しました。Glassfish は、認証プロセスで 2 つのテーブルに対して 2 つのクエリを作成します。1 つは として指定されたテーブルuserTableに、2 番目groupTableはセキュリティ レルム定義で決定されます。web.xml と glassfish-web.xml も正しいかどうかを確認します。

于 2012-05-01T16:41:26.757 に答える