복붙노트

[SPRING] Spring Security 버전 2.0의 커스텀 TokenGranter를 가진 OAuth2. +

SPRING

Spring Security 버전 2.0의 커스텀 TokenGranter를 가진 OAuth2. +

이전 버전의 OAuth2에서는 요소의 xml 구성에 추가하여 사용자 정의 토큰 부여자를 추가 할 수있었습니다.

암시 적, 클라이언트 자격 증명, 새로 고침 토큰 및 권한 부여 코드 부여 유형이 포함 된 기본 구성을 잃지 않고 AuthorizationServerConfigurerAdapter를 사용하여 Java Config로 권한 부여 서버를 확장 할 수 있을지 궁금합니다.

첫 번째 시도는 @Component가있는 TokenGranter를 만드는 것입니다.

@Component("customTokenGranter")
public class CustomTokenGranter {
     //implementation
}

Granter를 구성하는 데 필요한 tokenServices가 자동 실행 될 수 없으므로 종속성 분석 예외가 발생합니다.

두 번째 시도는 configure 메소드를 사용했다.

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception
{
    endpoints
        .tokenGranter(new CustomTokenGranter(endpoints.getTokenServices(),
                endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));

}

이것을 사용하면 기본 부여 유형이 등록되지 않습니다.

또한 낮은 순위의 두 번째 구성을 시도했지만 성공하지는 못했습니다. 맞춤 교부금 유형을 추가하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.기본 항목도 추가해야합니다 (예 : CompositeTokenGranter를 사용하는 경우 :

    기본 항목도 추가해야합니다 (예 : CompositeTokenGranter를 사용하는 경우 :

            List<TokenGranter> tokenGranters = getTokenGranters(); // implementation up to you
            tokenGranter = new CompositeTokenGranter(tokenGranters);
            endpoints.tokenGranter(tokenGranter);
    
  2. ==============================

    2.ClientDetailService에 대한 의존성 때문에 getTokenGranter 메소드에서 기본 허용자를 얻는 것이 어려워서 할 수있는 방법을 찾지 못했습니다. 나는 AuthorizationServerEndpointsConfigurer # tokenGranter ()의 코드를 복사하여 clientDetailService와 다른 빈들을 생성자에게 직접 전달했다. Granters와 끝점에 전달할 DefaultOAuth2RequestFactory를 만들기 위해 추가합니다.

    ClientDetailService에 대한 의존성 때문에 getTokenGranter 메소드에서 기본 허용자를 얻는 것이 어려워서 할 수있는 방법을 찾지 못했습니다. 나는 AuthorizationServerEndpointsConfigurer # tokenGranter ()의 코드를 복사하여 clientDetailService와 다른 빈들을 생성자에게 직접 전달했다. Granters와 끝점에 전달할 DefaultOAuth2RequestFactory를 만들기 위해 추가합니다.

    public TokenGranter tokenGranter() {
    
                ClientDetailsService clientDetails = clientDetailsService;
                AuthorizationServerTokenServices tokenServices = tokenServices();
                AuthorizationCodeServices authorizationCodeServices = authorizationCodeServices();
                OAuth2RequestFactory requestFactory = requestFactory();
    
                List<TokenGranter> tokenGranters = new ArrayList<TokenGranter>();
    
                tokenGranters.add(new AuthorizationCodeTokenGranter(tokenServices, authorizationCodeServices,
                        clientDetails, requestFactory));
                tokenGranters.add(new RefreshTokenGranter(tokenServices, clientDetails, requestFactory));
                tokenGranters.add(new ImplicitTokenGranter(tokenServices, clientDetails, requestFactory));
                tokenGranters.add(new ClientCredentialsTokenGranter(tokenServices, clientDetails, requestFactory));
                tokenGranters.add(new ResourceOwnerPasswordTokenGranter(authenticationManager, tokenServices,
                            clientDetails, requestFactory));
                tokenGranters.add(new CustomTokenGranter(authenticationManager, tokenServices(), clientDetailsService,
                        requestFactory));
    
                return new CompositeTokenGranter(tokenGranters);
        }
    
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    
            endpoints
                    .tokenServices(tokenServices())
                    .tokenStore(tokenStore())
                    .tokenEnhancer(tokenEnhancer())
                    .authorizationCodeServices(authorizationCodeServices())
                    .userApprovalHandler(userApprovalHandler())
                    .authenticationManager(authenticationManager)
                    .requestFactory(requestFactory())
                    .tokenGranter(tokenGranter());
        }
    

    즉, 새로운 코드 부여 유형이 UsernamePasswordAuthenticationToken의 하위 클래스 (어쨌든 암호 부여가 사용하는 인증 유형)를 사용했기 때문에 해당 코드를 제거하고 대신 단순히 다른 AuthenticationProvider를 추가 한 것입니다.

  3. ==============================

    3.다른 방법이 있습니다. 여기에서 복사했습니다.

    다른 방법이 있습니다. 여기에서 복사했습니다.

    이 예에서는, CustomTokenGranter라고하는 새로운 커스텀 TokenGranter가 디폴트의 TokenGranters를 사용해 CompositeTokenGranter에 추가됩니다. 이 예제는 AuthorizationServerEndpointsConfigurer의 public 메소드 getTokenGranter ()를 사용하여 기본 TokenGranter 's를 검색하므로이 예제가 마음에 들다.

    @Configuration
    @EnableAuthorizationServer
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {
    
        @Autowired
        private AuthenticationManager authenticationManager;
    
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            endpoints.authenticationManager(authenticationManager);
            endpoints.tokenGranter(tokenGranter(endpoints));
        }
    
        private TokenGranter tokenGranter(final AuthorizationServerEndpointsConfigurer endpoints) {
            List<TokenGranter> granters = new ArrayList<TokenGranter>(Arrays.asList(endpoints.getTokenGranter()));
            granters.add(new CustomTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), "custom"));
            return new CompositeTokenGranter(granters);
        }
    
  4. ==============================

    4.문서에 따르면, 우리는 :

    문서에 따르면, 우리는 :

    설명서를 참조하십시오. 그래서 다음과 같이 AuthenticationManager를 삽입 할 수 있습니다 :

        @Configuration
        @EnableAuthorizationServer
        public class AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {
    
            @Autowired
            private AuthenticationManager authenticationManager;
    
            @Override
            public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
                endpoints
                        .authenticationManager(authenticationManager)
    ........
    
  5. from https://stackoverflow.com/questions/25264358/spring-security-oauth2-with-custom-tokengranter-in-version-2-0 by cc-by-sa and MIT license