gpt4 book ai didi

java - 将 Shiro 与 OAuth 和 JWT 结合使用

转载 作者:行者123 更新时间:2023-12-02 02:23:24 27 4
gpt4 key购买 nike

我们在应用程序中使用shiro,并将 session 保存在数据库中以进行扩展。我们有自己的帐户数据库,到目前为止一切顺利。

这是核心安全组件:

  1. 数据库领域

通过UsernameAndPasswordToken和数据库中的密码验证用户,从数据库中检索权限。

  • DatabaseSessionDao
  • 扩展CachingSessionDAO,用于从数据库创建、读取、删除 session 。

  • 默认WebSessionManager
  • Shiro 内置组件。

    现在我们必须做出两种改进:

    1. 集成 OAuth 登录

    例如,用户应该能够通过 GoogleFacebook 或他们在我们的应用程序中注册的自己的帐户登录。

    然后我想知道我们如何重用现有的安全组件,例如DatabaseRealm,因为该领域将检查AuthenticationInfo的凭据,而该凭据在OAuth 上下文:

    @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 )
  • 目前 session 保存到数据库用于集群部署,但我们发现这可能会降低我们的响应速度,而且我们需要为移动平台提供api,因此我们尝试使用JWT.

    虽然shior似乎使用cookie + session来识别用户是否已通过身份验证。我不知道如何替换它。

    有什么建议吗?

    最佳答案

    最好添加新的Realm/Filter/用于重定向的登录网址

    GoogleRealm

    public class GoogleOAuthRealm extends AuthorizingRealm {
    ...

    public GoogleOAuthRealm() {
    //OauthToken implements AuthenticationToken to hold code
    setAuthenticationTokenClass(OauthToken.class);
    }

    ...

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    OauthToken tk = (OauthToken) token;
    String authCode = (String) tk.getPrincipal();
    //1. fetch token by posting code to google
    //2. validation & parse token
    //org.apache.shiro.authz.SimpleAuthorizationInfo
    SimpleAuthenticationInfo info = new SimpleAuthenticationInfo();
    //set permission manually
    return info;
    }
    ...
    }

    securityManager中配置GoogleRealm,并在google登录成功后重定向到新的url

    public class GoogleAuthenticatingFilter extends FormAuthenticationFilter

    <property name="filterChainDefinitions">
    <value>
    ...
    /login/googleLogin = GoogleAuthenticatingFilter
    ...
    </value>
    </property>

    关于java - 将 Shiro 与 OAuth 和 JWT 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48143687/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com