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