后端基于方法的权限控制--Spirng-Security
2019-08-16 12:03:21来源:博客园 阅读 ()
后端基于方法的权限控制--Spirng-Security
后端基于方法的权限控制--Spirng-Security
默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件;Spring Security 支持三种方法级注解, 分别是 JSR-205/Secured 注解/prePostEnabled。
开启方法级别注解
<global-method-security secured-annotations="enabled" />
<global-method-security jsr250-annotations="enabled" />
<global-method-security pre-post-annotations="enabled" />
//@Secured 注解
@EnableGlobalMethodSecurity(securedEnabled=true)
//JSR-205 注解
@EnableGlobalMethodSecurity(jsr250Enabled=true)
//@PreAuthorize 类型的注解(支持 Spring 表达式)
@EnableGlobalMethodSecurity(prePostEnabled=true)
开始方法级别的注释使用
Secured
只有满足角色的用户才能访问被注解的方法, 否则将会抛出 AccessDenied 异常.@Secured("ROLE_TELLER","ROLE_ADMIN"), 该方法只允许 ROLE_TELLER 或 ROLE_ADMIN 角色的用户访问.
@Secured("IS_AUTHENTICATED_ANONYMOUSLY"), 该方法允许匿名用户访问.JSR-205
@DenyAll
注解, 拒绝所有的访问
@PermitAll
注解, 运行所有访问
@RolesAllowed({"USER","ADMIN"})
, 该方法只允许有 ROLE_USER 或 ROLE_ADMIN 角色的用户访问.PreAuthorize
JSR-205 和 Secured 注解功能较弱, 不支持 Spring EL 表达式. 推荐使用 @PreAuthorize 类型的注解.@PreAuthorize 注解, 在方法调用之前, 基于表达式结果来限制方法的使用.
@PostAuthorize 注解, 允许方法调用, 但是如果表达式结果为 false, 将抛出一个安全性异常.
@PostFilter 注解, 允许方法调用, 但必要按照表达式来过滤方法的结果.
@PreFilter 注解, 允许方法调用, 但必须在进入方法之前过来输入值.
详解PreAuthorize
表达式
- returnObject 保留名
对于 @PostAuthorize 和 @PostFilter 注解, 可以在表达式中使用 returnObject 保留名, returnObject 代表着被注解方法的返回值, 我们可以使用 returnObject 保留名对注解方法的结果进行验证.
比如:
@PostAuthorize ("returnObject.owner == authentication.name")
public Book getBook();
@PostAuthorize 和 @PostFilter 本身在方法之后使用 ;本身使用场景不多
- 表达式中的 # 号
在表达式中, 可以使用 #argument123 的形式来代表注解方法中的参数 argument123.
比如:
@PreAuthorize ("#book.owner == authentication.name")
public void deleteBook(Book book);
还有一种 #argument123 的写法, 即使用 Spring Security @P注解来为方法参数起别名, 然后在 @PreAuthorize 等注解表达式中使用该别名. 不推荐这种写法, 代码可读性较差.
@PreAuthorize("#c.name == authentication.name")
public void doSomething(@P("c") Contact contact);
- 内置表达式有:
表达式 | 备注 |
---|---|
hasRole([role]) | 如果有当前角色, 则返回 true(会自动加上 ROLE_ 前缀) |
hasAnyRole([role1, role2]) | 如果有任一角色即可通过校验, 返回true,(会自动加上 ROLE_ 前缀) |
hasAuthority([authority]) | 如果有指定权限, 则返回 true |
hasAnyAuthority([authority1, authority2]) | 如果有任一指定权限, 则返回true |
principal | 获取当前用户的 principal 主体对象 |
authentication | 获取当前用户的 authentication 对象, |
permitAll | 总是返回 true, 表示全部允许 |
denyAll | 总是返回 false, 代表全部拒绝 |
isAnonymous() | 如果是匿名访问, 返回true |
isRememberMe() | 如果是remember-me 自动认证, 则返回 true |
isAuthenticated() | 如果不是匿名访问, 则返回true |
isFullAuthenticated() | 如果不是匿名访问或remember-me认证登陆, 则返回true |
hasPermission(Object target, Object permission) | |
hasPermission(Object target, String targetType, Object permission) |
原文链接:https://www.cnblogs.com/weir110/p/11312598.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Spring Aware源码
下一篇:国际化相关
- 类的继承,方法重新中修饰符如何定义 2020-06-10
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后 2020-06-10
- java里面main方法中的String[]args 2020-06-07
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为: & 2020-06-06
- 学习笔记之方法引用 2020-06-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash