学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)

在服务器端我们可以通过 Spring security 提供的注解对方法来进行权限控制。
Spring Security在方法的权限控制上支持三种类型的注解:JSR-250注解、@Secured注解和支持表达式的注解。

这三种注解默认都是没有启用的,需要单独通过global-method-security元素的对应属性进行启用

一、JSR-250 注解

1. 前期配置

(1)pom.xml 导入相关依赖

<dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
</dependency>

(2)在 spring-security.xml 开启该注解

<security:global-method-security jsr250-annotations="enabled" >
</security:global-method-security>

在这里插入图片描述
(3)在需要权限控制的方法上添加注解:

  • @RolesAllowed表示访问对应方法时所应该具有的角色
    @RolesAllowed({"USER","ADMIN"}) 该方法只要具有"USER","ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN

  • @PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制

  • @DenyAll是和PermitAll相反的,表示无论什么角色都不能访问

2. 使用示例

现在这里的要求是只有具有 ADMIN 权限的用户才能查询产品信息
在这里插入图片描述
(1)可以看到用户 Jack 具备 ADMIN 权限所以可以查看产品信息
在这里插入图片描述

在这里插入图片描述
(2)Mark 不具备ADMIN 权限,访问产品信息时,会报403错误,提示权限不足
在这里插入图片描述
在这里插入图片描述

二、@Secured注解

该注解不需要额外导入pom.xml

(1)配置 spring-security.xml

 <!--开启 @Secured注解-->
    <security:global-method-security secured-annotations="enabled" ></security:global-method-security>

(2)具体使用
在这里插入图片描述
注意这里分配权限时,需要指定完整名称加入前缀 ROLE_,不能省略

三、支持表达式的注解

  • @PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or
hasPermission(returnObject, 'ADMIN')");
  • @PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
  • @PreFilter 允许方法调用,但必须在进入方法之前过滤输入值

这里拿 @PostAuthorize 举例讲解:

(1)spring-security.xml 开启注解

<!--开启支持表达式的注解-->
    <security:global-method-security pre-post-annotations="enabled"> </security:global-method-security>

(2)具体使用

在这里插入图片描述
(3)常用的内置表达式:

表达式 描述
hasRole([role]) 当前用户是否拥有指定角色。
hasAnyRole([role1,role2]) 多个角色是一个以逗号进行分隔的字符串。如果当前用户拥有指定角色中的任意一个则返回true。
hasAuthority([auth]) 等同于hasRole
hasAnyAuthority([auth1,auth2]) 等同于hasAnyRole
Principle 代表当前用户的principle对象
authentication 直接从SecurityContext获取的当前Authentication对象
permitAll 总是返回true,表示允许所有的
denyAll 总是返回false,表示拒绝所有的
isAnonymous() 当前用户是否是一个匿名用户
isRememberMe() 表示当前用户是否是通过Remember-Me自动登录的
isAuthenticated() 表示当前用户是否已经登录认证成功了。
isFullyAuthenticated() 如果当前用户既不是一个匿名用户,同时又不是通过Remember-Me自动登录的,则返回true。

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/106720543
今日推荐