Я создаю загрузочное приложение 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для моего приложения.Может кто-нибудь подсказать, пожалуйста, что не так при попадании на сервер ресурсов?