Shiro:应该存储凭证?

时间:2014-02-09 10:16:52

标签: security rest credentials shiro

小史前史

我开发RESTful服务。该服务从Web前端接收请求,并使用实际业务逻辑将其重新发送到另一台服务器。我使用Shiro来保护我的服务。问题是某些业务逻辑功能需要用户密码。当然,我可以在我的校长中存储密码,但我认为在那里存储凭证是不正确的。

问题

那么,我应该存储凭据以在REST服务中访问的概念性正确位置是什么?

更新

好的,我也可以在Shiro会话中存储密码,但我不认为这是正确的地方。

1 个答案:

答案 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);