【发布时间】:2018-06-17 01:00:12
【问题描述】:
我们在我们的应用程序中使用 shiro,并且会话保存在数据库中以进行扩展。而且我们有自己的帐户数据库,到目前为止一切顺利。
这是核心安全组件:
- 数据库领域
通过UsernameAndPasswordToken验证用户和数据库中的密码,从数据库中检索权限。
- DatabaseSessionDao
扩展CachingSessionDAO,用于从数据库中创建、读取、删除会话。
- DefaultWebSessionManager
Shiro 内置组件。
现在我们要做两种改进:
- 集成 OAuth 登录
例如,用户应该能够通过Google 或Facebook 或他们在我们的应用程序中注册的帐户登录。
然后我想知道我们如何重新使用现有的安全组件,如DatabaseRealm,因为领域将检查在 OAuth 上下文中不可用的AuthenticationInfo 的凭据:
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
SimpleAuthenticationInfo info = null;
if (token instanceof UsernamePasswordToken) {
UsernamePasswordToken uToken = (UsernamePasswordToken) token;
User user = queryUserByName(uToken.getUsername());
info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword().toCharArray(), getName());
if (user.getSalt() != null) {
info.setCredentialsSalt(ByteSource.Util.bytes(user.getSalt()));
}
} else if (token instanceof OAuthUserToken) {
OAuthUserToken oToken = (OAuthUserToken) token;
String type = oToken.getOauthType();
String openId = oToken.getOpenID();
//then what should I do to make the `Credentials` check passed?
}
return info;
}
如何解决这个问题?
- 使用 JWT(Json Web Token)
会话保存到数据库中用于集群部署,但是我们发现它可能会降低我们的响应速度,而且我们需要为移动平台提供api,所以我们尝试使用JWT。
虽然似乎 shior 使用 cookie + session 来识别用户是否已通过身份验证。我不知道如何替换它。
有什么建议吗?
【问题讨论】: