Spring Security OAuth2实现使用JWT的示例代码

网友投稿 442 2023-01-22


Spring Security OAuth2实现使用JWT的示例代码

1、概括

在博客中,我们将讨论如何让Spring Security OAuth2实现使用jsON Web Tokens。

2、Maven 配置

首先,我们需要在我们的pom.xml中添加spring-security-jwt依赖项。

org.springframework.security

spring-security-jwt

我们需要为Authorization Server和Resource Server添加spring-security-jwt依赖项。

3、授权服务器

接下来,我们将配置我们的授权服务器使用JwtTokenStore - 如下所示

@Configuration

@EnableAuthorizationServer

public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Override

public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

endpoints.tokenStore(tokenStore())

.accessTokenConverter(accessTokenConverter())

.authenticationManager(authenticationManager);

}

@Bean

public TokenStore tokenStore() {

return new JwtTokenStore(accessTokenConverter());

}

@Bean

public JwtAccessTokenConverter accessTokenConverter() {

JwtAccessTokenConverter converter = new JwtAccessTokenConverter();

converter.setSigningKey("123");

return converter;

}

@Bean

@Primary

public DefaultTokenServices tokenServices() {

DefaultTokenServices defaultTokenServices = new DefaultTokenServices();

defaultTokenServices.setTokenStore(tokenStore());

defaultTokenServices.setSupportRefreshToken(true);

return defaultTokenServices;

}

}

请注意,在JwtAccessTokenConverter中使用了一个对称密钥来签署我们的令牌 - 这意味着我们需要为资源服务器使用同样的确切密钥。

4、资源服务器

现在,我们来看看我们的资源服务器配置 - 这与授权服务器的配置非常相似:

@Configuration

@EnableResourceServer

public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Override

public void configure(ResourceServerSecurityConfigurer config) {

config.tokenServices(tokenServices());

}

@Bean

public TokenStore tokenStore() {

return new JwtTokenStore(accessTokenConverter());

}

@Bean

public JwtAccessTokenConverter accessTokenConverter() {

JwtAccessTokenConverter converter = new JwtAccessTokenConverter();

converter.setSigningKey("123");

return converter;

}

@Bean

@Primary

public DefaultTokenServices tokenServices() {

DefaultTokenServices defaultTokenServices = new DefaultTokenServices();

defaultTokenServices.setTokenStore(tokenStore());

return defaultTokenServices;

}

}

请记住,我们将这两个服务器定义为完全独立且可独立部署的服务器。这就是我们需要在新配置中再次声明一些相同的bean的原因。

5、令牌中的自定义声明

现在让我们设置一些基础设施,以便能够在访问令牌中添加一些自定义声明。框架提供的标准声明都很好,但大多数情况下我们需要在令牌中使用一些额外的信息来在客户端使用。 我们将定义一个TokenEnhancer来定制我们的Access Token与这些额外的声明。 在下面的例子中,我们将添加一个额外的字段“组织”到我们的访问令牌 - 与此CustomTokenEnhancer:

public class CustomTokenEnhancer implements TokenEnhancer {

@Override

public OAuth2AccessToken enhance(

OAuth2AccessToken accessToken,

OAuth2Authentication authentication) {

Map additionalInfo = new HashMap<>();

additionalInfo.put("organization", authentication.getName() + randomAlphabetic(4));

((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);

return accessToken;

}

}

然后,我们将把它连接到我们的授权服务器配置 - 如下所示:

@Override

public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();

tokenEnhancerChain.setTokenEnhancers(

Arrays.asList(tokenEnhancer(), accessTokenConverter()));

endpoints.tokenStore(tokenStore())

.tokenEnhancer(tokenEnhancerChain)

.authenticationManager(authenticationManager);

}

@Bean

public TokenEnhancer tokenEnhancer() {

return new CustomTokenEnhancer();

}

有了这个新的配置启动和运行 - 这是一个令牌令牌有效载荷看起来像:

{

"user_name": "john",

"scope": [

"foo",

"read",

"write"

],

"organization": "johnIiCh",

"exp": 1458126622,

"authorities": [

"ROLE_USER"

],

"jti": "e0ad1ef3-a8a5-4eef-998d-00b26bc2c53f",

"client_id": "fooClientIdPassword"

}

5.1、在JS客户端使用访问令牌

最后,我们要在AngualrJS客户端应用程序中使用令牌信息。我们将使用angular-jwt库。 所以我们要做的就是在index.html中使用“组织”声明:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:api接口开源管理工具(开源接口管理系统)
下一篇:Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~