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 WebSecurity
và HttpSecurity
, và do đó giải thích lý do tại sao tôi bao gồm cả WebSecurity
và HttpSecurity
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()
và 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
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ó)? –
@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
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. –