gpt4 book ai didi

Spring 安全 OAuth2 : Purge TokenStore

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

有什么方法可以配置 Spring Security OAuth2 以便它自动清除 TokenStore?

我想时不时地删除过期的 token 。我看过 InMemoryTokenStore 代码,它时不时地执行刷新。

但是 JdbcTokenStore 不执行任何清除操作,那么谁负责从存储中删除过期的 token ?

我已经实现了一个使用 MongoDB 作为存储的 TokenStore,但我也遇到了同样的问题。没有人从存储中删除过期的 token 。

最佳答案

不幸的是,JdbcTokenStore 不会自动清除过期的 token 。由您决定是否清除旧 token 。这是我如何添加这样一个机制的想法。

到期日期OAuth2AccessToken 的一部分它作为序列化的 java 对象保存在数据库中。为了检测 OAuth2AccessToken 是否符合删除条件,您需要从数据库中读取它并反序列化它。这可能会导致性能下降,您需要清除大量 OAuth2AccessToken。

我的建议是扩展oauth_access_token表由 TIMESTAMP(H2 方言)类型的列 expiration 组成,用于保存到期日期。

create table oauth_access_token (
token_id VARCHAR(256),
token LONGVARBINARY,
authentication_id VARCHAR(256),
user_name VARCHAR(256),
client_id VARCHAR(256),
authentication LONGVARBINARY,
refresh_token VARCHAR(256),
expiration TIMESTAMP
);

扩展JdbcTokenStore并覆盖storeAccessToken方法。不要忘记更改 insertAccessTokenSql 以遵守插入语句中的新列 expiration

public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) {
String refreshToken = null;
if (token.getRefreshToken() != null) {
refreshToken = token.getRefreshToken().getValue();
}

if (readAccessToken(token.getValue())!=null) {
removeAccessToken(token.getValue());
}

jdbcTemplate.update(insertAccessTokenSql, new Object[] { extractTokenKey(token.getValue()),
new SqlLobValue(serializeAccessToken(token)), authenticationKeyGenerator.extractKey(authentication),
authentication.isClientOnly() ? null : authentication.getName(),
authentication.getOAuth2Request().getClientId(),
new SqlLobValue(serializeAuthentication(authentication)), extractTokenKey(refreshToken), token.getExpiration() }, new int[] {
Types.VARCHAR, Types.BLOB, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.BLOB, Types.VARCHAR, Types.TIMESTAMP });
}

启用 Spring 的 Task Execution and Scheduling并添加一个清除旧 token 的预定方法。

@Scheduled(fixedRate = 10000)
public void purgeOldTokens() {
java.util.Date now = new Date();
jdbcTemplate.update("delete from oauth_access_token where expiration <?", now);
}

小心。这段代码只是展示了我的想法。我不能保证没有错误。您的代码可能而且应该与我的示例代码有所不同。

关于 Spring 安全 OAuth2 : Purge TokenStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30617554/

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