从Spring Boot 1.3.3应用程序使用Spring Security 4.0.3。
该应用程序有两种类型的HTTP内容:“API”一个REST API和“UI”一个基于Web的二手界面(Thymeleaf + Spring Web MVC)。 / p>
应用程序REST API的大多数端点都是使用Basic保护的,但有些端点不是,并且始终可用。
简化配置如下:
// In one method, the security config for the "API"
httpSecurity
.antMatcher("/api/**")
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.authorizeRequests()
.antMatchers("/api/ping").permitAll()
.antMatchers("/api/**").hasRole("USER")
.and()
.httpBasic();
// In another method, the security config for the "UI"
httpSecurity
.authorizeRequests()
.antMatchers("/ui/", "/ui/index.html", "/ui/css/*", "/ui/js/*", "/ui/img/*").permitAll()
.antMatchers("/ui/user/**").hasRole("USER")
.antMatchers("/ui/**").denyAll()
.and()
.formLogin().loginPage("/ui/login.html").permitAll().failureUrl("/ui/login.html").defaultSuccessUrl("/ui/user/main.html")
.and()
.logout().logoutUrl("/ui/logout").permitAll().logoutSuccessUrl("/ui/login.html")
.and()
.httpBasic();
对安全端点的访问按预期工作。
但是当用户提供无效的基本身份验证时,对“... / api / ping”等公共端点的访问会失败。当然,如果没有提供有效的基本身份验证,这些端点就可以正常工作。
来自Spring Security的这个401令人惊讶。我们如何实现永远不会为选定端点返回任何401或403的Spring Security配置?
感谢您的时间。
更新1 :添加了有关“用户界面”存在和安全配置的信息
答案 0 :(得分:0)
订单很重要。最具体的规则(路径)首先:
httpSecurity
.antMatchers("/api/ping").permitAll()
// and then the rest
这是因为如果有antMatcher("/api/**")
之类的匹配,Spring Security将不会评估以后的规则。