Как получить все полномочия аутентифицированного пользователя на сервере ресурсов OAuth2 - PullRequest
0 голосов
/ 22 января 2019

Существует сервер ресурсов со следующей конфигурацией:

@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

Где не так и какая конфигурация потеряна на сервере ресурсов?

1 Ответ

0 голосов
/ 08 августа 2019

Вы можете использовать такой код

@GetMapping({"/user", "/me"})
public Map<String, Object> user(Principal principal){
    Map<String, Object> map = new LinkedHashMap<>();
    map.put("name", principal.getName());
    if( principal instanceof OAuth2Authentication) {
        OAuth2Authentication oauth = (OAuth2Authentication)principal;
        map.put("authorities",oauth.getUserAuthentication().getAuthorities()
                               .stream()
                               .map(GrantedAuthority::getAuthority)
                               .collect(Collectors.toList()));
    }
    return map;
}
...