SpringSecurity的antMatchers匹配顺序踩坑
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()
.csrf().disable()
//省略其他代码
.and()
.authorizeRequests()
.antMatchers("/api/login","/api/common/registry/**","/api/common/pageQuestion/**").permitAll()
.antMatchers("/api/admin/**").hasRole("admin")
.antMatchers("/api/common/**").hasRole("common")
//重点是下面这句
.antMatchers("/api/common/userInfo").hasAnyRole("admin","common")
.anyRequest().authenticated()
//省略其他代码
}
这里我做了角色控制,什么角色只能访问什么地址。
.antMatchers("/api/common/**").hasRole("common")
表示只有common角色才能访问 /api/common/ 开头的地址,就算是admin角色也不能访问这个地址。
而这句
.antMatchers("/api/common/userInfo").hasAnyRole("admin","common")
访问 /api/common/userInfo 只要有admin角色或common角色就能访问了。
想象一下,/api/common/ 开头的地址只能common角色访问,所以/api/common/userInfo理应只有common角色才能访问,然后我单独对 /api/common/userInfo 这个地址设了 hasAnyRole(“admin”,“common”) 那现在这个地址应该就是只要有admin角色或common角色就能访问
测试
admin不能访问,普通用户(也就是common角色)能访问。这跟我想象的不一样。
然后我就把那两句代码调换了顺序,hasAnyRole()的放在上面
.antMatchers("/api/common/userInfo").hasAnyRole("admin","common")
.antMatchers("/api/common/**").hasRole("common")
测试
common角色的同样能访问,
现在admin角色也能访问了(系统里管理员的username是"admin",管理员的角色也是"admin")