通常,信息保存在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