Spring Boot Resource Server не может авторизовать роли с токеном доступа oAuth 2

У меня есть следующие 3 микросервиса

  • Сервер конфигурации
  • Сервер аутентификации с использованием MongoDB со ссылкой на ссылку. Я успешно перенес проект с 1.2.4 на 1.3.3.
  • Служба пользователей. Rest Controller и Resource Server с 3 методами Get (каждый для ADMIN, MERCHANT и CONSUMER).

Я хочу ограничить доступ к методам GET контроллера REST в зависимости от роли пользователя. Конфигурация ресурса выглядит следующим образом

 @Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override 
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers(HttpMethod.GET, "/**").hasAuthority("ROLE_ADMIN")
            .anyRequest()
                .authenticated();
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
         resources.resourceId("admin-api");
    }
}

Для проверки я просто пытаюсь заблокировать службу пользователя для всех пользователей, кроме пользователей с ролью ADMIN. Тем не менее, я получаю 401 Отказано в доступе. Я также пробовал hasRole("ADMIN") с тем же результатом. Если я удалю эти критерии авторизации, пользователь будет правильно аутентифицирован (не принимает неправильный токен доступа). Ответ от userInfoUri сервера авторизации выглядит следующим образом

{
  "details": {
    "remoteAddress": "0:0:0:0:0:0:0:1",
    "sessionId": null,
    "tokenValue": "a4244b33-80b2-48db-909d-f8aaaaf45985",
    "tokenType": "Bearer",
    "decodedDetails": null
  },
  "authorities": [
    {
      "authority": "ROLE_ADMIN"
    }
  ],
  "authenticated": true,
  "userAuthentication": {
    "details": null,
    "authorities": [
      {
        "authority": "ROLE_ADMIN"
      }
    ],
    "authenticated": true,
    "principal": "[email protected]",
    "credentials": null,
    "client": false,
    "name": "[email protected]"
  },
  "credentials": "",
  "clientOnly": false,
  "oauth2Request": {
    "clientId": "admin-web",
    "scope": [
      "trust",
      "read",
      "write"
    ],
    "requestParameters": {
      "grant_type": "password",
      "username": "[email protected]"
    },
    "resourceIds": null,
    "authorities": [],
    "approved": true,
    "refresh": false,
    "redirectUri": null,
    "responseTypes": [],
    "extensions": {},
    "refreshTokenRequest": null,
    "grantType": "password"
  },
  "principal": "[email protected]",
  "name": "[email protected]"
}

Я не могу понять, почему авторизация на основе ролей не работает. Любая помощь приветствуется.


person ionade    schedule 23.04.2016    source источник


Ответы (2)


Измените зависимость spring-security-oauth2 на это

<dependency>
<groupId>org.springframework.security.oauth</groupId>
 <artifactId>spring-security-oauth2</artifactId>
 <version>2.0.7.RELEASE</version>
</dependency>
person Malike St    schedule 25.06.2016

Убедитесь, что реализация кодирования/декодирования JWT одинакова на обоих стороннем сервере ресурсов и сервере аутентификации. Также попробуйте на сервере oauth создать в памяти 3 пользователя с 3 ролями:

@Configuration
public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {
...
    @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("user").password("user").authorities("read").roles("USER")
                .and()
                    .withUser("admin").password("admin").authorities("read","write").roles("ADMIN");
        }
...
}

Попробуйте получить access_token для этих пользователей, а затем сделайте запрос на сервер ресурсов, включив в запрос заголовок Authorization: Bearer [access_token]. Если вы получите ту же ошибку, значит, ваша реализация JWT неверна... Пожалуйста, посмотрите о JWT здесь https://bshaffer.github.io/oauth2-server-php-docs/overview/jwt-access-tokens/

person Rzv Razvan    schedule 14.10.2017