【问题标题】:Spring Security OAuth2 - Find refresh token by usernameSpring Security OAuth2 - 按用户名查找刷新令牌
【发布时间】:2019-05-03 01:36:08
【问题描述】:

假设我们有一个管理员想要使所有用户令牌无效(有效地在任何地方注销用户),但不阻止他的帐户。用户应该仍然能够正常登录。

例子:

clientIds.forEach(clientId -> {
        Collection<OAuth2AccessToken> accessTokens = tokenStore.findTokensByClientIdAndUserName(clientId, username);
        accessTokens.forEach(accessToken -> tokenServices.revokeToken(accessToken.getValue()));
});

只有当访问令牌仍然有效(未过期)时才能正常工作,因为找到了访问令牌并基于它们,revokeToken 使访问令牌和刷新令牌都无效。但是,如果访问令牌已过期,findTokensByClientIdAndUserName 将找不到任何内容,因此没有任何内容无效,并且刷新令牌仍然有效并可以使用。

我到处看了看,似乎每个人都通过使用访问令牌或通过将刷新令牌值作为请求参数传递来撤销刷新令牌。

是否可以在不使用访问令牌的情况下找到刷新令牌?

【问题讨论】:

    标签: spring-security oauth-2.0 spring-security-oauth2 refresh-token


    【解决方案1】:

    你可以自己实现TokenStore接口并添加一个方法如:

    OAuth2RefreshToken findRefreshTokenByUserName(String userName);
    

    【讨论】:

    • 我已经考虑过了,但是在查看 oauth_refresh_token 表的架构后,那里没有 username 字段。它只存在于oauth_access_token 表中。创建全新的TokenStore 似乎有点矫枉过正,因此我将扩展JdbcTokenStore,按照您的建议添加findRefreshTokenByUserName,并覆盖storeRefreshToken 方法以包含用户名。谢谢你的建议:)
    • 我对它进行了更多研究,oauth_refresh_tokenauthentication 字段,所以从技术上讲,可以从那里检索username,但这需要我选择全部令牌,反序列化其authentication 字段并按用户名过滤。这是一个很大的不,所以我会坚持将表格增加一列。
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2012-07-21
    • 2016-08-12
    • 2017-11-09
    • 2013-11-08
    • 2015-03-09
    • 2020-07-04
    • 2017-12-02
    相关资源
    最近更新 更多