2016-04-07 14 views
6

Một ứng dụng Khởi động mùa xuân với các dịch vụ REST phải cho phép truy cập công cộng vào các dịch vụ nhất định, đồng thời hạn chế các dịch vụ khác chỉ cho người dùng được ủy quyền. Khi một phương pháp configure(WebSecurity web) được thêm vào lớp SecurityConfig như hình dưới đây, một 403 error được gửi đến trình duyệt web của người dùng, và các tập tin log Xuân Boot đưa ra một báo lỗi cho biết:/api-url có một danh sách bộ lọc trống trong Spring Boot Security

/registration-form has an empty filter list 

gì thay đổi cụ thể cần phải được được thực hiện cho mã bên dưới để nhận được dịch vụ /registration-form để được phân phối thành công cho bất kỳ người dùng nào, bao gồm cả người dùng ẩn danh/chưa được xác thực?

Đây là lớp SecurityConfig:

@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(WebSecurity webSecurity) throws Exception { 
     webSecurity.ignoring().antMatchers("/registration-form"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .formLogin() 
       .and() 
      .httpBasic().and() 
      .authorizeRequests() 
       .antMatchers("/login1").permitAll() 
       .antMatchers("/login2").permitAll() 
       .anyRequest().authenticated(); 
    } 
} 

Và đây là hoàn thành các bản ghi:

2016-04-07 16:42:18.548 INFO 8937 --- [nio-8001-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring FrameworkServlet 'dispatcherServlet' 
2016-04-07 16:42:18.548 INFO 8937 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet  : FrameworkServlet 'dispatcherServlet': initialization started 
2016-04-07 16:42:18.656 INFO 8937 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet  : FrameworkServlet 'dispatcherServlet': initialization completed in 108 ms 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/css/**' 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/js/**' 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/images/**' 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/**/favicon.ico' 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/error' 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/registration-form' 
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.security.web.FilterChainProxy  : /registration-form has an empty filter list 

Trong pom.xml, tài liệu tham khảo chỉ đối với an ninh như sau:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 

Tôi đã xem xét số phiên bản trong pom.xml, và điều gần gũi nhất tôi có thể tìm được:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.0.RELEASE</version> 
    <relativePath /> <!-- lookup parent from repository --> 
</parent> 

ĐANG THỰC HIỆN NGHIÊN CỨU:


1.) This other post đưa ra một lời giải thích tốt về sự khác biệt giữa WebSecurityHttpSecurity, và do đó giải thích lý do tại sao tôi bao gồm cả WebSecurityHttpSecurity trong mã của tôi được hiển thị ở trên.

2.) This 2012 post describes a similar error and solution, nhưng tập trung vào phiên bản cũ của Bảo mật mùa xuân nói chung sử dụng xml configuration và không cụ thể cho Khởi động mùa xuân với Java Configuration.

3.) This blog entry explains that old xml config files like web.xml are largely replaced by the new application.properties file in Spring Boot. Do đó, tôi không chắc liệu giải pháp cho vấn đề hiện tại có phải là thêm một cái gì đó application.properties hoặc thêm một số Cấu hình Java cho Spring Security.

4.) This blog entry mô tả bằng cách sử dụng @Bean chú thích để tiêm một bean ServletContextInitializer mà thêm một bộ lọc để một điểm kết thúc mà được mô tả bởi @RequestMapping chú thích trong một lớp học mùa xuân Boot Controller. Ví dụ này là bộ lọc tệp nhiều phần, nhưng tôi tự hỏi liệu phương pháp này có thể được sử dụng để thêm bộ lọc thích hợp để giải quyết thông báo lỗi OP hiện tại hay không.

5.) This 2014 posting describes two approaches to customizing the behavior of a ServletContextInitializer in Spring Boot. Một cách tiếp cận là để có lớp Application.java mở rộng SpringBootServletInitializer và sau đó ghi đè các phương thức configure()onStartup(). Cách tiếp cận khác được hiển thị là thêm các dòng vào tệp application.properties bằng không gian tên server. Danh sách các thuộc tính phổ biến có thể được đặt trong application.properties được cung cấp at this link, nhưng tôi không thể xác định thuộc tính nào được đặt để giải quyết vấn đề được xác định bởi OP hiện tại.

6.) Câu trả lời của @ DaveSyer cho this related question đề xuất đặt endpoints.info.sensitive=true trong application.properties để làm cho TẤT CẢ các điểm cuối mở. Điều này khiến tôi tìm thấy this documentation page from Spring about endpoints, đề xuất đặt endpoints.name.sensitive=false trong application.properties, trong đó name là tên của điểm kết thúc bị thay đổi. Nhưng thiết lập endpoints.api-url.sensitive=false trong application.properties không giải quyết được sự cố và nhật thực cho một cảnh báo rằng endpoints.api-url.sensitive=false is an unknown property. Tôi có phải xác định ánh xạ thuộc tính ở một nơi khác hoặc có thể thêm / để làm cho nó endpoints./api-url.sensitive=false? Làm cách nào để tôi có được tên chính xác để sử dụng cho điểm cuối /api-url và đây có phải là cách tiếp cận chính xác để giải quyết vấn đề này không?

7.) Tôi đọc this other posting, và sử dụng ví dụ của nó để tạo ra một Filter Registration Bean bên trong Application lớp chính của ứng dụng xuân Boot, nhưng bản ghi gỡ lỗi vẫn hiển thị cùng một thông điệp chỉ ra rằng /api-url has an empty filter list. Dưới đây là đoạn code mà tôi thêm vào lớp Application:

@Bean 
public FilterRegistrationBean shallowEtagHeaderFilter() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new ShallowEtagHeaderFilter()); 
    registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); 
    registration.addUrlPatterns("/api-url"); 
    return registration; 
} 

Các cách tiếp cận có thể từ nghiên cứu này bao gồm:

1.) adding something to `application.properties` 
2.) adding `@Bean` annotation to inject a `ServletContextInitializer` 
3.) adding some Spring Security config using Java Configuration. 
4.) having Application.java extend SpringBootServletInitializer and 
     then overriding methods. 
5.) adding @Bean annotation to add a filter registration bean 
+0

Danh sách bộ lọc trống không phải là lỗi (bạn đã yêu cầu được bỏ qua). Mùa xuân an ninh không gửi 403. Bạn cần phải tìm ra nơi mà đến từ (có thể bên trong dịch vụ đăng ký chính nó)? –

+0

@DaveSyer Cảm ơn bạn rất nhiều. Bạn có thể đề nghị cách xác định thư đến từ đâu không? Có lẽ một liên kết? Tôi dự định sẽ dành toàn bộ ngày làm việc vào ngày mai này. – CodeMed

+0

Bạn đã có các bản ghi DEBUG cho Bảo mật mùa xuân vì vậy nếu bạn không nhìn thấy nó ở đó, tôi không có bất kỳ đề xuất nào, xin lỗi. Có lẽ bạn nên thực hiện một dự án mẫu đơn giản. –

Trả lời

1

Đây là những gì tôi có nơi tôi hạn chế một số URL và một số công

@Override 
     public void configure(HttpSecurity http) throws Exception { 
      http.csrf().disable() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
       .and() 
       .authorizeRequests() 
       .antMatchers(actuatorEndpoints()).hasRole(userConfig.getAdminRole()) 
       .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
       .antMatchers("/signup", 
          "/payment/confirm", 
          "/api/address/zipcodes/**", 
          "/user/password/reset", 
          "/user/password/change", 
          "/user/email/verify", 
          "/password/update", 
          "/email/verify", 
          "/new-products/**").permitAll() 
       .antMatchers("/api/**", "/files/**").authenticated(); 
     } 
+0

Điều này không dẫn đến việc kiểm soát dòng chảy bên trong servlet. Thay vào đó, nó chỉ gắn nhãn người dùng là 'ROLE_ANONYMOUS' và từ chối truy cập vào servlet vì các lý do được hiển thị trong' 1.) 'trong phần ** ONGOING RESEARCH ** được hiển thị ở trên trong OP của tôi. – CodeMed

+0

Thay đổi duy nhất tôi thực hiện cho mã của bạn, ngoài việc bản địa hóa '/ url-patterns', là để nhận xét ra một dòng duy nhất:' //. AntMatchers (actuatorEndpoints()). HasRole (userConfig.getAdminRole()) ' – CodeMed

0

Tôi nghĩ rằng những gì bạn đã làm được thực hiện/lỗi xem tài nguyên được bảo vệ. Hoặc mở nó ra hoặc ngừng sử dụng @EnableWebSecurity (nó sẽ tắt một số thứ mà khởi động mùa xuân có thể đã làm cho bạn nếu không).

+0

Những đề xuất này không giải quyết được sự cố. Tuy nhiên, tôi đang theo đuổi mục tiêu lớn hơn bằng cách làm theo một trong các ví dụ mã khác của bạn. – CodeMed

+0

Tôi đang tiếp cận vấn đề tương tự này bằng cách phân tích một ứng dụng mà cá nhân bạn đã phát triển. Bạn có sẵn sàng để xem một câu hỏi tôi có về nó? Đây là liên kết: http://stackoverflow.com/questions/36655518/disable-confirmation-page-in-spring-oauth2 – CodeMed

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