小史前史
我开发RESTful服务。该服务从Web前端接收请求,并使用实际业务逻辑将其重新发送到另一台服务器。我使用Shiro来保护我的服务。问题是某些业务逻辑功能需要用户密码。当然,我可以在我的校长中存储密码,但我认为在那里存储凭证是不正确的。
问题
那么,我应该存储凭据以在REST服务中访问的概念性正确位置是什么?
更新
好的,我也可以在Shiro会话中存储密码,但我不认为这是正确的地方。
答案 0 :(得分:1)
通常,信息保存在AuthenticationToken的实现中。此接口有两个方法:getPrincipal(例如login或email)和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);