Существует сервер ресурсов со следующей конфигурацией:
@SpringBootApplication
@RestController
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ResourceServer.class);
}
public static void main(String[] args) {
SpringApplication.run(ResourceServer.class, args);
}
//@PreAuthorize("hasRole('ROLE_USER')")
@RequestMapping(value = "/user", method = RequestMethod.GET)
public Map<String, String> user(Principal user) {
OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication();
Authentication userAuthentication = oAuth2Authentication.getUserAuthentication();
return (Map<String, String>) userAuthentication.getDetails();
}
}
и
@Configuration
@EnableResourceServer
public class ResourcesServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/api/**").access("#oauth2.hasScope('read')");
}
@Primary
@Bean
public RemoteTokenServices tokenService() {
RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl("http://localhost:8081/auth/account/getDetailUser");
tokenService.setClientId("web");
tokenService.setClientSecret("secret");
return tokenService;
}
}
и его application.yml:
spring:
datasource:
url: jdbc:oracle:thin:@192.168.192.131:1521:hamed
hikari:
connection-test-query: SELECT 1 FROM DUAL
minimum-idle: 1
maximum-pool-size: 5
driver-class-name: oracle.jdbc.OracleDriver
username: test
password: test
initialization-mode: always
jpa:
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.Oracle12cDialect
logging:
level:
org.springframework.security: DEBUG
server:
port: 8083
context-path: /micro1
security:
basic:
enabled: false
oauth2:
client:
clientId: web
clientSecret: secret
accessTokenUri: http://localhost:8081/auth/oauth/token
userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
resource:
userInfoUri: http://localhost:8081/auth/account/getDetailUser
Необходимо отметить, что потоком является Authorization_code и хранилище токенов JDBC в UAA, а версия весенней загрузки - 1.5.8.RELEASE
Пользователь перенаправляется в UAA и успешно входит в систему и перенаправляется на клиент с кодом. Все до сих пор в порядке, но когда я запрашиваю на сервере ресурсов, где я хочу получить все полномочия аутентифицированного пользователя, как это:
@RequestMapping(value = "/user", method = RequestMethod.GET)
public Map<String, String> user(Principal user) {
OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication();
Authentication userAuthentication = oAuth2Authentication.getUserAuthentication();
return (Map<String, String>) userAuthentication.getDetails();
}
Возникает следующее исключение:
java.lang.ClassCastException:
org.springframework.security.authentication.AnonymousAuthenticationToken
не может быть приведен к
org.springframework.security.oauth2.provider.OAuth2Authentication
Где не так и какая конфигурация потеряна на сервере ресурсов?