这个问题在这里已经有答案了:
spring安全:多个http配置不工作(2个答案)
一年前关门了。
我有一个spring引导配置,它看起来像这样:
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore( new Filter(), UsernamePasswordAuthenticationFilter.class)
.csrf().disable() // Disabled, cause enabling it will cause sessions
.headers()
.frameOptions()
.sameOrigin()
.addHeaderWriter(new XXssProtectionHeaderWriter())
.and()
.authorizeRequests()
.antMatchers("/app/**", "/rest/**").hasAuthority(DefaultPrivileges.ACCESS_TASK)
.anyRequest().permitAll();
我的理解只是从 /app
或者 /rest
将被我的自定义过滤器截获,但结果是请求到根目录( http://localhost:8080/context/
)也被截获。
我有多种spring security配置,其他配置如下所示:
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.csrf().disable();
if (taskAppProperties.isRestEnabled()) {
if (restAppProperties.isVerifyRestApiPrivilege()) {
http
.antMatcher("/*-api/**")
.authorizeRequests()
.antMatchers("/*-api/**").hasAuthority(DefaultPrivileges.ACCESS_REST_API)
.and()
.httpBasic();
} else {
http
.antMatcher("/*-api/**")
.authorizeRequests()
.antMatchers("/*-api/**").authenticated()
.and()
.httpBasic();
}
} else {
http
.antMatcher("/*-api/**")
.authorizeRequests()
.antMatchers("/*-api/**").denyAll();
}
有人能帮忙吗?
2条答案
按热度按时间ghhaqwfi1#
我知道这有点混乱,但实际上有两个
antMatchers
方法,从authorizedRequests
另一个分支requestMatchers
.让我们看看下面的声明:
这个
requestMatchers()
dsl是描述与spring安全过滤器链示例相关的端点的地方。因此,这个过滤器链只会对以/app
或者/api
.我们再来看看另一个:
虽然这看起来是在做同样的事情,但事实并非如此。那是因为你打电话给
antMatchers
属于的方法authorizeRequests()
.这就是为什么indentation对于spring security dsl很重要。因为dsl中有一个层次结构,所以你想缩进,就像你想缩进你的文档一样
if
声明。在SpringSecurity5.2中,新的lambda dsl简化了一点:
d4so4syb2#
HttpSecurity.authorizeRequests
-退货ExpressionInterceptUrlRegistry
我们在这里设置匹配器和角色条件,将使用方法添加这些条件ExpressionInterceptUrlRegistry.getRegistry
如果你只在permitAll
发生实际身份验证的存根。我们添加的过滤器使用
HttpSecurity.addFilterBefore
不会检查任何匹配的请求。如果需要,可以在自定义过滤器中再执行一次检查,以避免其他uri