2

В настоящее время я работаю над приложением Spring для аутентификации Oauth2, но у меня возникла проблема с внедрением пользовательского ClientDetailsService.spring security OAuth2 - custom ClientDetailsService

Я не могу использовать обычный inMemory ou jdbc clientDetailsService, потому что информация о клиентах не хранится в моем приложении, я получаю их из внешнего веб-сервиса. Но когда я устанавливаю пользовательский ClientDetailService, я больше не получаю страницу access_confirmation (я получаю пустую страницу).

Чтобы показать вам мой вопрос, который я не использую мое приложение, но тест ванили с официальной весны - безопасность OAuth проекта spring-security-oauth

Вот код приложения:

@SpringBootApplication 
@EnableResourceServer 
@RestController 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @RequestMapping("/") 
    public String home() { 
     return "Hello World"; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public String create(@RequestBody MultiValueMap<String, String> map) { 
     return "OK"; 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private AuthenticationManager authenticationManager; 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints.authenticationManager(authenticationManager); 
     } 

     @Override 
     public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
      security.checkTokenAccess("isAuthenticated()"); 
     } 

     public ClientDetailsService clientDetailsService() { 
      return new ClientDetailsService() { 
       @Override 
       public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { 
        BaseClientDetails details = new BaseClientDetails(); 
        details.setClientId(clientId); 
        details.setAuthorizedGrantTypes(Arrays.asList("authorization_code")); 
        details.setScope(Arrays.asList("read, trust")); 
        details.setResourceIds(Arrays.asList("oauth2-resource")); 
        Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
        authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT")); 
        details.setAuthorities(authorities); 
        return details; 
       } 
      }; 
     } //*/ 


     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      // @formatter:off 

      clients.withClientDetails(clientDetailsService()); 

      /*clients.inMemory() 
       .withClient("test") 
        .authorizedGrantTypes("authorization_code") 
        .authorities("ROLE_CLIENT") 
        .scopes("read", "trust") 
        .resourceIds("oauth2-resource"); 
      //*/ 
      // @formatter:on 
     } 
    } 

} 

Как вам можно увидеть, что я добавляю свой заказ clientDetailsService и изменяю конфигурацию ClientDetailsServiceconfigurer, чтобы установить его вместо клиента clientDetailsService.

Моя проблема заключается в том, что при попытке получить мой токен я не получаю свою страницу access_confirmation после того, как я зарегистрировал пользователя.

Я нашел свою проблему, мое определение областей в моем clientDetails было ложным. У меня был Arrays.asList («читать, доверять») вместо Arrays.asList («читать», «доверять»)

Я что-то пропустил? мне нужно установить свой собственный клиентDetailsService в другое место?

+1

Есть ли у вас дополнительная информация, как StackTrace или журнал, которые показывают больше о вашей проблеме? –

+0

Я не получаю никаких ошибок в своем тесте. Если я пытаюсь получить маркер с установкой Почтальон - локальный: 8080/OAuth/авторизацию в качестве URL авторизации - локальный: 8080/OAuth/маркер в качестве маркера URL - тест, как идентификатор клиента - authorization_code как тип гранта I получить пустой экран после аутентификации пользователя (он не пошел на страницу confirm_access) –

+0

Если я тестирую его в своем браузере с этим URL-адресом: http: // localhost: 8080/oauth/authorize? client_id = test & redirect_uri = http: // localhost: 8080/& response_type = code Я перенаправлен на redirect-uri, не получив страницу confirm_access до (для URL-адреса браузера я знаю, что URL-адрес не подходит для моего токена, но он должен быть enuogh для проверки авторизации) –

ответ

1

Попробуйте изменить ClientDetails осущ так:

public ClientDetailsService clientDetailsService() { 
     return new ClientDetailsService() { 
      @Override 
      public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { 
       BaseClientDetails details = new BaseClientDetails(); 
       details.setClientId(clientId); 
       details.setAuthorizedGrantTypes(Arrays.asList("authorization_code")); 
       details.setScope(Arrays.asList("read, trust")); 
       details.setRegisteredRedirectUri(Collections.singleton("http://anywhere.com")); 
       details.setResourceIds(Arrays.asList("oauth2-resource")); 
       Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
       authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT")); 
       details.setAuthorities(authorities); 
       return details; 
      } 
     }; 
    } //*/ 
+0

Спасибо за помощь, я нашел свою ошибку, это было мое определение области в моих клиентских деталях, которая была ложной. У меня был Arrays.asList («читать, доверять») вместо Arrays.asList («читать», «доверять») –

+0

Nice! Не заметила опечатку, которая тоже мне понравилась :) – vmarusic

Смежные вопросы