antMatcher()与antMatchers()的Spring安全应用程序

时间:2017-11-15 01:42:58

标签: java spring-mvc spring-boot spring-security

只是想知道我是否以正确的方式解释answer to this question

如果我们只需要保护这样一条路径:

http.antMatcher("/api/**").authorizeRequests()....

然后使用antMatcher()

如果我们需要保护多个这样的网址路径:

http
.authorizeRequests()
    .antMatchers("/high_level_url_A/sub_level_1").hasRole('USER')
    .antMatchers("/high_level_url_A/sub_level_2").hasRole('USER2')
    ...

然后使用antMatchers()

this question中有两个答案,但每个答案中提供的示例与另一个答案中的示例相矛盾。第一个答案说作者不需要antMatcher(),第二个答案总是以'antMatcher()IIUC开头。

1 个答案:

答案 0 :(得分:7)

HttpSecurity.antMatcher()HttpSecurity个实例的默认请求匹配器从AntPathRequestMatcher更改为AnyRequestMatcherExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry.antMatchers()用于将授权规则应用于与当前HttpSecurity实例关联的端点子集。

示例代码:

http
    .antMatcher("/api/**")
    .httpBasic()
        .disable()
    .authorizeRequests()
        .antMatchers("/api/user/**", "/api/ticket/**", "/index")
            .hasRole("ROLE_USER");

在上面的示例中,对与 / api / ** 匹配的所有端点禁用基本授权。此外,匹配 / api / user / ** / api / ticket / ** 的端点将要求请求的身份验证包含ROLE_USER。但是,当用户尝试访问 / index 时,将会遇到基本的身份验证提示。输入凭据后,无论请求的身份验证是否包含ROLE_USER,都将授予用户对端点的访问权限。这是因为 .antMatcher(" / api / **")将整个HttpSecurity实例的范围限制为特定的AntMatcher。

以下示例将确保HttpSecurity的范围包括之前的三个AntMatchers,而不是其他任何内容:

http
    .requestMatchers()
        .antMatchers("/api/user/**", "/api/ticket/**", "/index")
        .and()
    .httpBasic()
        .disable()
    .authorizeRequests()
        .any()
            .hasRole("ROLE_USER");