SpringSecurity的antMatchers匹配顺序踩坑

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")

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 是一个用于身份验证和授权的框架,它的源码读取顺序可以大致分为以下几个步骤: 1. 加载配置文件:Spring Security 使用 XML 或 Java Config 的方式进行配置,首先会加载配置文件,获取安全配置的相关信息。 2. 创建过滤器链:Spring Security 通过过滤器链来处理请求,根据配置文件中的顺序,创建不同的过滤器,并将它们按照一定的顺序组成过滤器链。 3. 加载认证信息:在过滤器链中,有一个特殊的过滤器称为 `UsernamePasswordAuthenticationFilter`,它负责处理用户名密码的认证。在请求到达该过滤器时,会根据配置的认证方式加载用户信息,例如从数据库或者内存中加载用户信息。 4. 执行认证逻辑:在认证过滤器中,会调用相应的 `AuthenticationManager` 进行认证。`AuthenticationManager` 是一个接口,具体的实现类是 `ProviderManager`,它会根据配置中的认证提供者(`AuthenticationProvider`)来进行认证操作。 5. 认证结果处理:认证完成后,会根据认证结果进行相应的处理。例如,如果认证成功,会生成一个身份验证凭证(`Authentication`)对象,并将其保存到 `SecurityContextHolder` 中,供后续的授权操作使用。 6. 执行授权逻辑:在过滤器链中,有一个称为 `FilterSecurityInterceptor` 的过滤器,它负责处理授权逻辑。当请求到达该过滤器时,会根据配置的访问规则进行权限检查,并决定是否允许请求进入。 7. 异常处理:在整个过程中,如果发生异常,Spring Security 会根据配置的异常处理机制进行相应的处理,例如重定向到登录页面或返回错误信息。 这只是 Spring Security 源码的一个简要读取顺序,具体的实现细节和流程会更加复杂,涉及到很多不同的类和接口。如果你想深入了解 Spring Security 的源码,建议阅读官方文档以及相关的源码注释和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值