2012-08-31 109 views
4

我已經一遍又一遍地關於如何用Shiro進行用戶登錄,但它仍然看起來像是缺少一個重要的部分:shiro如何對存儲的用戶名和密碼驗證給定的用戶名和密碼?我想到的最多的是It is each Realm's responsibility to match submitted credentials with those stored in the Realm's backing data storefrom here。但是,這是如何完成的?如何使用Shiro對用戶進行身份驗證?

下面是我試過的,但結果仍然是一個無效的身份驗證。

的LoginController

@RequestMapping(value = "/login.htm", method = RequestMethod.POST) 
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object cmd, BindException errors) throws Exception { 

    LoginCommand command = (LoginCommand) cmd; 
    UsernamePasswordToken token = new UsernamePasswordToken(command.getUsername(), command.getPassword()); 
    System.out.println("onSubmit"); 
    System.out.println(token.getUsername()); 
    System.out.println(token.getPassword()); 

    try 
    { 
     SecurityUtils.getSubject().login(token); 
    } catch (AuthenticationException e) { 
     errors.reject("error.invalidLogin", "The username or password was not correct."); 
    } 

    if (errors.hasErrors()) { 
     return showForm(request, response, errors); 
    } else { 
     return new ModelAndView("accessTest"); 
    } 
} 

境界

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { 
    UsernamePasswordToken token = (UsernamePasswordToken) authcToken; 

    System.out.println("doGetAuthenticationInfo"); 
    System.out.println(user.getUsername()); 
    System.out.println(user.getPassword()); 

    // user is a test object in place of a database 
    if(user != null) { 
     return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); 
    } else { 
     return null; 
    } 
} 
+0

你可以分享輸出嗎?我的第一個猜測是那個token.getPassword()!= user.getPassword()。 – jbunting

+0

是。我測試了所有輸出,所有輸出都是相同的。 –

回答

1

發現了答案。這是一個愚蠢的。我複製了一些示例代碼,並將證書匹配器設置爲HashedCredentialsMatcher。我沒有做任何哈希,所以它沒有工作。刪除了setCredentialsMatcher,它工作。

相關問題