在带有oauth2的Spring Security中使用jwt令牌时访问被拒绝

时间:2019-01-10 12:07:36

标签: spring spring-boot spring-security oauth-2.0 spring-security-oauth2

根据角色访问请求时,我的访问被拒绝。我不知道为什么我在春季启动时将春季安全性与oauth2结合使用。

配置的授权服务器是-

@EnableAuthorizationServer
@Configuration
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {
    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authManager;
    @Autowired
    private AuthConfig config;
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) {
        security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient(config.getClientId()).secret("{noop}".concat(config.getClientSecret()))
                .scopes("read", "write").authorizedGrantTypes("password", "refresh_token")
                .accessTokenValiditySeconds(config.getAccessTokenValidity())
                .refreshTokenValiditySeconds(config.getRefresTokenValidity());
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.pathMapping("/oauth/token", config.getAuthPath());
        endpoints.authenticationManager(authManager).tokenStore(tokenStore()).accessTokenConverter(jwtTokenEnhancer());
        endpoints.userDetailsService(userDetailsService);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(jwtTokenEnhancer());
    }

    @Bean
    protected JwtAccessTokenConverter jwtTokenEnhancer() {
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"),
                config.getKeyStorePassword().toCharArray());
        JwtAccessTokenConverter converter = new CustomTokenEnhancer();
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("jwt"));
        return converter;
    }
}

并且资源服务器配置为

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "my_rest_api";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID).stateless(false);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests().antMatchers("/create/user").permitAll().antMatchers("/hello").hasRole("superadmin")
                .anyRequest().authenticated().and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.NEVER);
    }

}

并且服务器安全性配置为

@Configuration
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

,生成的令牌中的解码数据为

{
  "exp": 1547123578,
  "user_name": "superadmin",
  "authorities": [
    {
      "authority": "ROLE_superadmin"
    }
  ],
  "jti": "e1f6e67c-16b8-4a12-a300-fae7f406359e",
  "client_id": "pgcil",
  "scope": [
    "read",
    "write"
  ]
}

但是带有jwt令牌的http请求http://localhost:8089/hello给出了访问被拒绝的错误。谁能告诉我我在做错什么。任何帮助将不胜感激。

0 个答案:

没有答案