2014-02-09 70 views
0

小史前史:Shiro:應該存儲憑據?

我開發RESTful服務。該服務接收來自Web前端的請求,並將其重新發送到具有實際業務邏輯的另一臺服務器。我使用Shiro來保護我的服務。問題在於某些業務邏輯功能需要用戶密碼。當然,我可以在我的校長存儲密碼,但我認爲在那裏存儲憑據是不正確的。

問題

那麼,什麼是我應該存儲憑據有我的REST服務內訪問概念正確的地方?

更新

好吧,我也可以密碼儲存在四郎的會議,但我不認爲這是正確的位置。

回答

1

通常,信息保存在AuthenticationToken的實現中。該接口有兩個方法:getPrincipal(例如登錄或電子郵件)和getCredentials()。最後一個通常用於存儲密碼。

如果你看一下UsernamePasswordToken類,它是這個接口的實現,你會發現這兩個確實用於用戶名和密碼。

現在我們所做的是爲我們自己的認證機制擴展AuthorizingRealm類,並在認證方法中將令牌存儲在主體中。

@Override 
public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { 
... authentication logic 

    SimplePrincipalCollection principalCollection = new SimplePrincipalCollection(login, realmName); 
    principalCollection.add(token, realmName); 

    SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principalCollection, login.getPasswordHash()); 
    return simpleAuthenticationInfo; 
} 

現在你可以得到令牌後:

PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals(); 
    AuthenticationToken token = principals.oneByType(AuthenticationToken.class); 
+0

如何理解** ** AuthenticationToken **或** AuthenticationInfo實體在身份驗證過程中只使用,則不要在應用存儲(我認爲這是出於安全原因)。所以,認證後不可能得到他們。正如所說的[這裏](http://shiro-user.582556.n2.nabble.com/Get-AuthenticationInfo-From-Subject-td5003710.html),它看起來像委託人和會議只是我們可以存儲一些額外的實體用戶相關信息。 – Sergey

+0

我想我還不夠完整,用更多的信息更新了答案。 – Wouter