在spring security中使用requestMatchers()。antMatchers()而没有动词的原因是什么?

时间:2016-07-22 13:28:57

标签: spring-security

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();

有人可以解释为什么需要特定行,因为下一行明确表示所有请求都必须经过身份验证吗?

2 个答案:

答案 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行中,不匹配的请求将由其他剩余链检查。