Spring JDBC Token Store дает 401 несанкционированный доступ к ресурсу - PullRequest
0 голосов
/ 24 апреля 2019

Я создаю загрузочное приложение Spring и реализую oauth JDBC Token Store.Я реализовал сервер авторизации и сервер ресурсов в одном приложении.Токен генерируется и сохраняется также в базе данных с использованием кода сервера авторизации, но когда я пытаюсь попасть на сервер ресурсов, я получаю 401 код несанкционированной ошибки.

Access Token generation:
{
    "access_token": "9fb18582-1096-4c7e-b06c-b571c6d4dfde",
    "token_type": "bearer",
    "refresh_token": "cb7b5d6f-f765-4e99-9282-a8a2a31cb39b",
    "expires_in": 3123,
    "scope": "read write"
}

Доступ к серверу ресурсов:

{
    "timestamp": "2019-04-24T16:12:18.326+0000",
    "status": 401,
    "error": "Unauthorized",
    "message": "Unauthorized",
    "path": "/secured/company/"
}

Я передал Авторизационный канал 9fb18582-1096-4c7e-b06c-b571c6d4dfde в заголовок при доступе к URL-адресу ресурса.Ниже приведен исходный код для этого:

@Configuration
@EnableAuthorizationServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import(ServerSecurityConfig.class)
public class AuthServerOAuth2Config extends AuthorizationServerConfigurerAdapter {

    @Autowired

    @Qualifier("dataSource")
    private DataSource dataSource;

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private PasswordEncoder oauthClientPasswordEncoder;

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    @Bean
    public OAuth2AccessDeniedHandler oauthAccessDeniedHandler() {
        return new OAuth2AccessDeniedHandler();
    }

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

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
                .userDetailsService(userDetailsService);
    }
}

@Configuration
@EnableWebSecurity
@Order(1)
@Import(Encoders.class)
public class ServerSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private PasswordEncoder userPasswordEncoder;

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

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

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "resource-server-rest-api";
    private static final String SECURED_READ_SCOPE = "#oauth2.hasScope('read')";
    private static final String SECURED_WRITE_SCOPE = "#oauth2.hasScope('write')";
    private static final String SECURED_PATTERN = "/secured/**";

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

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.requestMatchers().antMatchers(SECURED_PATTERN).and().authorizeRequests()
                .antMatchers(HttpMethod.GET, SECURED_PATTERN).access(SECURED_WRITE_SCOPE).anyRequest()
                .access(SECURED_READ_SCOPE);
    }

}

Ниже класса контроллера:

@RestController
@RequestMapping("/secured")
public class CompanyController {

    @RequestMapping(value="/company",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(value = HttpStatus.OK)
    @PreAuthorize("hasAuthority('COMPANY_READ')")
    public @ResponseBody
    String getAll() {
        return "Hello World!";
    }    
}

Я имею в виду https://dzone.com/articles/secure-spring-rest-with-spring-security-and-oauth2для моего приложения.Может кто-нибудь подсказать, пожалуйста, что не так при попадании на сервер ресурсов?

...