Spring安全oauth实现中有一种常见的做法是使用以下行保护oauth端点:
.requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
整个设置如下:
http
.formLogin().loginPage("/login").permitAll()
.and()
.requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
.and()
.authorizeRequests().anyRequest().authenticated();
有人可以解释为什么需要特定行,因为下一行明确表示所有请求都必须经过身份验证吗?
答案 0 :(得分:2)
Spring Security管理几个Servlet过滤器链。
在现代Spring安全性(v3.2.x及更高版本)中,每个链由WebSecurityConfigurerAdapter
配置并基于@Order(...)
类注释应用,直到首次报告它支持HttpServletRequest
,这是通过.requestMatchers()
DSL配置:
从版本3.1开始,{@code FilterChainProxy}使用列表配置 {@link SecurityFilterChain}实例,每个实例都包含{@link RequestMatcher} 以及应该应用于匹配请求的过滤器列表。大多数应用 将只包含一个过滤器链,如果您使用名称空间,则不会 必须明确设置链。如果您需要更细粒度的控制,您可以制作 使用{@code}命名空间元素。这定义了一个URI模式 以及应该应用于的过滤器列表(以逗号分隔的bean名称) 与模式匹配的请求。示例配置可能如下所示:
public class FilterChainProxy extends GenericFilterBean {
...
/**
* Returns the first filter chain matching the supplied URL.
*
* @param request the request to match
* @return an ordered array of Filters defining the filter chain
*/
private List<Filter> getFilters(HttpServletRequest request) {
for (SecurityFilterChain chain : filterChains) {
if (chain.matches(request)) {
return chain.getFilters();
}
}
return null;
}
然后将选定的链应用于安全请求。
您的设置仅适用于3个网址,如果没有配置,则会保护所有其他网址不安全。
答案 1 :(得分:2)
requestMatchers
行指定安全检查适用于哪些请求。 authorizeRequests
行进行实际的安全检查。
如果您省略requestMatchers
行,则所有请求都将按照authorizeRequests
指定的方式进行检查。如果没有检查某些请求,则默认情况下检查会成功。
在requestMatchers
行中,不匹配的请求将由其他剩余链检查。