springSecurity基于表达式鉴权

本文深入探讨了如何使用Spring Security的表达式语言进行权限控制,包括URL安全表达式、自定义Bean鉴权以及方法级别的访问控制。文章通过示例详细讲解了PreAuthorize和PostAuthorize注解的使用,并提供了源码链接供读者进一步研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

上一篇文章已经介绍了springSecurity的使用了,本篇文章主要介绍一下使用spring EL表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限

常见的表达式

Spring Security可用表达式对象的基类是SecurityExpressionRoot

表达式 描述
hasRole([role]) 用户拥有指定的角色时返回true(hasRole()默认会将配置中的 role 带有 ROLE_ 前缀再和用户的角色权限 进行对比)
hasAnyRole([role1,role2]) 用户拥有任意一个指定中的角色时返回true
hasAuthority([auth]) 同hasRole()但不添加前缀 ROLE_
hasAnyAuthority([auth1,auth2]) 同hasAnyRole([auth1,auth2]),但不添加前缀 ROLE_
permitAll 永远返回true
denyAll 永远返回false
anonymous 当前用户时 anonymous(匿名、未认证)时返回true
rememberMe 当前用户时 rememberMe(记住登录) 时发挥true
authentication 当前登录用户的 authentication 对象
fullAuthticated 当前用户既不是 anonymous 也不是 rememberMe 时返回true(即正常认证登录时返回true)
hasIpAddress("192.168.1.0/24") ip匹配时返回true

如果需要移除hasRole的前缀,在security配置类中添加如下代码

	@Bean
    GrantedAuthorityDefaults grantedAuthorityDefaults(){
   
   
        return new GrantedAuthorityDefaults("");//remove the ROLE_ prefix
    }

URL安全表达式

http.antMatchers("/test/*").access("hasRole('ADMIN') or hasRole('USER')")
                .anyRequest().authenticated();

这里我们定义了 /test/ URL的范围,只有拥有 ADMINUSER 权限的用户可以访问 /test/ 匹配的URL

在Web 安全表达式中引用Bean自定义鉴权

http.antMatchers("/test/*").
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值