只想看看我是否在正确解释answer to this question。
如果我们只需要确保一条这样的路径:
http.antMatcher("/api/**").authorizeRequests()....
然后使用
antMatcher()
。如果我们需要像这样保护多个URL路径,请执行以下操作:
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开头。 最佳答案
HttpSecurity.antMatcher()将HttpSecurity实例的默认请求匹配器从AntPathRequestMatcher更改为AnyRequestMatcher。 ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry.antMatchers()用于将授权规则应用于与当前HttpSecurity实例关联的端点的子集。
示例代码:
http
.antMatcher("/api/**")
.httpBasic()
.disable()
.authorizeRequests()
.antMatchers("/api/user/**", "/api/ticket/**", "/index")
.hasRole("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("USER");
编辑如果您使用#hasRole(),则您的角色不应以“ROLE_”开头,因为这是自动插入的。