将 JdbcTokenStore 用于 JWT
Using JdbcTokenStore for JWT
对于我的 REST API 我正在使用 JWT 进行 OAuth2 授权。目前我正在扩展 JwtTokenStore
以将刷新令牌存储在内存中,以便我能够撤销它们。
// TODO: This is a temporary in memory solution that needs to be replaced with a concrete persistent implementation.
public class MyJwtTokenStore extends JwtTokenStore {
private List<OAuth2RefreshToken> refreshTokens;
public MyJwtTokenStore(JwtAccessTokenConverter jwtTokenEnhancer) {
super(jwtTokenEnhancer);
refreshTokens = new ArrayList<>();
}
@Override
public OAuth2RefreshToken readRefreshToken(String tokenValue) {
OAuth2RefreshToken refreshToken = super.readRefreshToken(tokenValue);
if (!refreshTokens.contains(refreshToken)) {
throw new InvalidGrantException("Invalid refresh token: " + tokenValue);
}
return refreshToken;
}
@Override
public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) {
refreshTokens.add(refreshToken);
}
@Override
public void removeRefreshToken(OAuth2RefreshToken token) {
refreshTokens.remove(token);
}
}
我想开始将这些刷新令牌存储在数据库中而不是内存中。 Spring 为我们提供了 JdbcTokenStore
,但是如果我扩展 class 那么我就无法在构造函数中设置 JwtAccessTokenConverter
。我知道我可以只实现我自己的 saving/retrieving JWT 方法,但我想利用 JdbcTokenStore
提供的 https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql 对模式的开箱即用支持。
create table oauth_refresh_token (
token_id VARCHAR(256),
token LONGVARBINARY,
authentication LONGVARBINARY
);
Spring是否支持在数据源中存储 JWT?我需要像 "JwtJdbcTokenStore" 这样的东西。执行此操作但仍使用来自 JdbcTokenStore
的预定义查询和操作的好方法是什么?
不,Spring 不支持此功能。参考这个线程
https://github.com/spring-projects/spring-security-oauth/issues/687
保留 JWT 令牌无关紧要,因为 JWT 令牌是自包含的,您需要知道的一切都已在该令牌中可用。
话虽如此,如果您有持久化它们的需求,那么您将不得不为其编写自定义逻辑。
对于我的 REST API 我正在使用 JWT 进行 OAuth2 授权。目前我正在扩展 JwtTokenStore
以将刷新令牌存储在内存中,以便我能够撤销它们。
// TODO: This is a temporary in memory solution that needs to be replaced with a concrete persistent implementation.
public class MyJwtTokenStore extends JwtTokenStore {
private List<OAuth2RefreshToken> refreshTokens;
public MyJwtTokenStore(JwtAccessTokenConverter jwtTokenEnhancer) {
super(jwtTokenEnhancer);
refreshTokens = new ArrayList<>();
}
@Override
public OAuth2RefreshToken readRefreshToken(String tokenValue) {
OAuth2RefreshToken refreshToken = super.readRefreshToken(tokenValue);
if (!refreshTokens.contains(refreshToken)) {
throw new InvalidGrantException("Invalid refresh token: " + tokenValue);
}
return refreshToken;
}
@Override
public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) {
refreshTokens.add(refreshToken);
}
@Override
public void removeRefreshToken(OAuth2RefreshToken token) {
refreshTokens.remove(token);
}
}
我想开始将这些刷新令牌存储在数据库中而不是内存中。 Spring 为我们提供了 JdbcTokenStore
,但是如果我扩展 class 那么我就无法在构造函数中设置 JwtAccessTokenConverter
。我知道我可以只实现我自己的 saving/retrieving JWT 方法,但我想利用 JdbcTokenStore
提供的 https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql 对模式的开箱即用支持。
create table oauth_refresh_token (
token_id VARCHAR(256),
token LONGVARBINARY,
authentication LONGVARBINARY
);
Spring是否支持在数据源中存储 JWT?我需要像 "JwtJdbcTokenStore" 这样的东西。执行此操作但仍使用来自 JdbcTokenStore
的预定义查询和操作的好方法是什么?
不,Spring 不支持此功能。参考这个线程 https://github.com/spring-projects/spring-security-oauth/issues/687
保留 JWT 令牌无关紧要,因为 JWT 令牌是自包含的,您需要知道的一切都已在该令牌中可用。
话虽如此,如果您有持久化它们的需求,那么您将不得不为其编写自定义逻辑。