programing

Spring Boot 1.3.3 @EnableResourceServer 및 @EnableOAuth2So 동시에

minimums 2023. 7. 22. 09:54
반응형

Spring Boot 1.3.3 @EnableResourceServer 및 @EnableOAuth2So 동시에

내 서버를 베어러 액세스 토큰을 허용할 수 있는 리소스 서버로 설정합니다.

그러나 이러한 토큰이 존재하지 않는 경우 OAuth2Server를 사용하여 사용자를 인증하고 싶습니다.

저는 다음과 같이 하려고 합니다.

@Configuration
@EnableOAuth2Sso
@EnableResourceServer
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }
}

그러나, 이 경우에는, 오직@EnableResourceServer주석 작업돌아옵니다

Full authentication is required to access this resource

로그인 페이지로 리디렉션 안 함

내가 언급한 것은@Order중요합니다, 만약 제가 추가한다면.@Order(0)주석, 로그인 페이지로 리디렉션되지만 Http 헤더에 있는 access_token으로 리소스에 액세스할 수 없습니다.

Authorization : Bearer 142042b2-342f-4f19-8f53-bea0bae061fc

어떻게 하면 제 목표를 달성할 수 있을까요?나는 그것이 Access 토큰과 SSO를 동시에 사용하기를 원합니다.

감사합니다.

동일한 요청에 두 구성을 모두 사용하는 것은 모호합니다.이에 대한 해결책이 있을 수 있지만 별도의 요청 그룹을 정의하는 것이 더 명확합니다.

  • OAuth2So: 브라우저에서 오는 사용자의 경우 토큰에 대한 인증 공급자로 리디렉션합니다.
  • ResourceServer: 일반적으로 api 요청의 경우, 어딘가에서 가져온 토큰과 함께 제공됩니다(대부분 동일한 인증 공급자로부터).

이 작업을 수행하려면 request matcher를 사용하여 구성을 분리합니다.

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Bean("resourceServerRequestMatcher")
    public RequestMatcher resources() {
        return new AntPathRequestMatcher("/resources/**");
    }

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http
            .requestMatcher(resources()).authorizeRequests()
            .anyRequest().authenticated();
    }

}

sso 필터 체인에서 제외합니다.

@Configuration
@EnableOAuth2Sso
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("resourceServerRequestMatcher")
    private RequestMatcher resources;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        RequestMatcher nonResoures = new NegatedRequestMatcher(resources);
        http
            .requestMatcher(nonResoures).authorizeRequests()
            .anyRequest().authenticated();
    }
}

그리고 당신의 모든 자원을 아래에 두시오./resources/**

물론 이 경우 둘 다 동일한 oauth2 구성을 사용합니다.accessTokenUri,jwt.key-value등)

업데이트 1:

실제로 위의 구성에 대해 이 요청 메처를 사용하여 원래 목표를 달성할 수 있습니다.

new RequestHeaderRequestMatcher("Authorization")

업데이트 2: (@sid-morad의 코멘트 설명)

Spring Security는 각 구성에 대한 필터 체인을 생성합니다.각 필터 체인의 요청 일치 장치는 구성 순서에 따라 평가됩니다.WebSecurityConfigurerAdapter기본 순서 100이 있습니다.ResourceServerConfiguration기본적으로 3개가 주문됩니다.그 말은ResourceServerConfiguration의 요청 일치자를 먼저 평가했습니다.다음과 같은 구성에 대해 이 순서를 재정의할 수 있습니다.

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Autowired
    private org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration configuration;

    @PostConstruct
    public void setSecurityConfigurerOrder() {
        configuration.setOrder(3);
    }
...
}

 

@Configuration
@EnableOAuth2Sso
@Order(100)
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter {
...
}

따라서 예, 다음에 대해 요청 일치자가 필요하지 않습니다.SsoSecurityConfiguration위의 견본에서하지만 배후에 있는 이유를 알게 되어 좋습니다 :)

언급URL : https://stackoverflow.com/questions/37059128/spring-boot-1-3-3-enableresourceserver-and-enableoauth2sso-at-the-same-time

반응형