2016-05-05 15 views
9

Tôi muốn máy chủ của tôi là một ResourceServer, có thể chấp nhận một truy cập Bearer mã thông báoXuân Boot 1.3.3 @EnableResourceServer và @ EnableOAuth2Sso đồng thời

Tuy nhiên, nếu đặt trước đó không tồn tại, tôi muốn sử dụng OAuth2Server để xác thực người dùng của tôi.

tôi cố gắng để làm như:

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

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

Tuy nhiên, trong trường hợp này, chỉ có @EnableResourceServer tác phẩm chú thích. Nó trả

Full authentication is required to access this resource 

Và đừng chuyển hướng tôi đến trang đăng nhập

tôi đã đề cập rằng @Order là quan trọng, nếu tôi thêm các @Order(0) chú thích, tôi sẽ chuyển hướng đến trang đăng nhập, tuy nhiên, tôi không thể truy cập tài nguyên của tôi với header access_token trong Http:

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

Làm cách nào để đạt được mục tiêu? Tôi muốn nó sử dụng mã thông báo truy cập và SSO cùng một lúc.

Cảm ơn ~

Trả lời

4

Sử dụng cả hai cấu hình trên cùng một yêu cầu sẽ không rõ ràng. Có thể có một số giải pháp cho điều đó, nhưng rõ ràng hơn để xác định các nhóm yêu cầu riêng biệt:

  • OAuth2Sso: cho người dùng đến từ một trình duyệt, chúng tôi muốn chuyển hướng họ đến các nhà cung cấp xác thực cho token
  • ResourceServer: thường cho các yêu cầu api, đến với một mã thông báo họ nhận được từ đâu đó (có lẽ hầu hết từ nhà cung cấp chứng thực cùng)

đối đạt được điều này, tách các cấu hình với yêu cầu khớp:

@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(); 
    } 

} 

Và loại trừ những từ chuỗi lọc 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(); 
    } 
} 

Và đặt tất cả nguồn lực của bạn dưới /resources/**

Tất nhiên trong trường hợp này cả hai sẽ sử dụng OAuth2 cùng cấu hình (accessTokenUri, jwt.key-value , vv)

UPDATE1:

Trên thực tế bạn có thể đạt được mục tiêu ban đầu của bạn bằng cách sử dụng khớp yêu cầu này cho cấu hình trên:

new RequestHeaderRequestMatcher("Authorization") 

UPDATE2: (Giải thích về @ sid-Morad của bình luận)

Xuân An tạo ra một bộ lọc chuỗi cho mỗi cấu hình. Trình kết nối yêu cầu cho mỗi chuỗi bộ lọc được đánh giá theo thứ tự cấu hình. WebSecurityConfigurerAdapter có thứ tự mặc định là 100 và ResourceServerConfiguration được đặt hàng 3 theo mặc định. Điều này có nghĩa là đối sánh yêu cầu của ResourceServerConfiguration được đánh giá trước tiên. Lệnh này có thể được ghi đè cho các cấu hình này như:

@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 { 
... 
} 

Vì vậy, có, yêu cầu khớp là không cần thiết cho SsoSecurityConfiguration trong ví dụ trên. Nhưng tốt để biết lý do đằng sau :)

+0

Câu trả lời của bạn hữu ích cho tôi, Cảm ơn! và muốn chỉ ra 'phần mới NegatedRequestMatcher (tài nguyên)' là không cần thiết trong trường hợp của tôi. –

+0

Xin chào, cảm ơn! Tôi đã giải quyết nhận xét của bạn trong phần UPDATE2 của bài đăng gốc của tôi. – plajko

Các vấn đề liên quan