SpringSecurityOAuth2实现使用JWT的示例代码

1、概括

成都创新互联,为您提供成都网站建设成都网站制作、网站营销推广、网站开发设计,对服务成都房屋鉴定等多个行业拥有丰富的网站建设及推广经验。成都创新互联网站建设公司成立于2013年,提供专业网站制作报价服务,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏心悦目的作品。 与客户共同发展进步,是我们永远的责任!

在博客中,我们将讨论如何让Spring Security OAuth3实现使用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 OAuth3AuthorizationServerConfig 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 OAuth3ResourceServerConfig 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 OAuth3AccessToken enhance(
   OAuth3AccessToken accessToken, 
   OAuth3Authentication authentication) {
    Map additionalInfo = new HashMap<>();
    additionalInfo.put("organization", authentication.getName() + randomAlphabetic(4));
    ((DefaultOAuth3AccessToken) 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中使用“组织”声明: