2 回答
TA贡献1871条经验 获得超8个赞
anyRequest()始终应用第一个匹配器,因为匹配器的顺序很重要,请参见HttpSecurity#authorizeRequests:
注意匹配器是按顺序考虑的。因此,以下内容无效,因为第一个匹配器匹配每个请求,并且永远不会到达第二个映射:
http.authorizeRequests().antMatchers("/**").hasRole("USER").antMatchers("/admin/**")
.hasRole("ADMIN")
您修改和简化的配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.httpBasic()
.and()
.authorizeRequests()
.antMatchers("/users/all").hasRole("admin")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.exceptionHandling().accessDeniedPage("/403");
}
TA贡献2037条经验 获得超6个赞
问题在于配置时的规则顺序HttpSecurity。发生的情况是当请求传入并到达
authorizeRequests().anyRequest().authenticated()
由于用户已通过身份验证,因此永远不会进入
.antMatchers("/users/all").hasRole("admin")
这是如何配置它的示例:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.httpBasic()
.and()
.authorizeRequests()
.antMatchers("/public").permitAll()
.antMatchers("/user").hasRole("USER")
.antMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.exceptionHandling().accessDeniedPage("/403");
}
它使用责任链模式。它将遍历规则链,直到找到匹配的规则。永远不会达到匹配规则之后的任何规则。通常,在编写用于经过身份验证的请求的规则时,将优先考虑更具体的规则。
添加回答
举报