[SPRING] Spring Security 버전 2.0의 커스텀 TokenGranter를 가진 OAuth2. +
SPRINGSpring Security 버전 2.0의 커스텀 TokenGranter를 가진 OAuth2. +
이전 버전의 OAuth2에서는
암시 적, 클라이언트 자격 증명, 새로 고침 토큰 및 권한 부여 코드 부여 유형이 포함 된 기본 구성을 잃지 않고 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.기본 항목도 추가해야합니다 (예 : CompositeTokenGranter를 사용하는 경우 :
기본 항목도 추가해야합니다 (예 : CompositeTokenGranter를 사용하는 경우 :
List<TokenGranter> tokenGranters = getTokenGranters(); // implementation up to you tokenGranter = new CompositeTokenGranter(tokenGranters); endpoints.tokenGranter(tokenGranter);
-
==============================
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.다른 방법이 있습니다. 여기에서 복사했습니다.
다른 방법이 있습니다. 여기에서 복사했습니다.
이 예에서는, 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.문서에 따르면, 우리는 :
문서에 따르면, 우리는 :
설명서를 참조하십시오. 그래서 다음과 같이 AuthenticationManager를 삽입 할 수 있습니다 :
@Configuration @EnableAuthorizationServer public class AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints .authenticationManager(authenticationManager) ........
from https://stackoverflow.com/questions/25264358/spring-security-oauth2-with-custom-tokengranter-in-version-2-0 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Hibernate Envers - createQuery (...) .executeUpdate (), .persist () 및 .merge ()에 대한 감사 레코드를 작성하지 않습니다. (0) | 2019.07.19 |
---|---|
[SPRING] 스프링 보안 : java.sql.SQLException : 컬럼 인덱스가 범위를 벗어남, 3> 2 (0) | 2019.07.19 |
[SPRING] 컨트롤러에서 응답 방지 (0) | 2019.07.19 |
[SPRING] 봄철 자바 주석 스캐닝 (0) | 2019.07.19 |
[SPRING] Spring에 대한 간단한 예외 처리 기술이 있습니까? (0) | 2019.07.19 |