2014-02-09 41 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