Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Security 提供的方式做授权,也可以自定义授权逻辑。一句话,你想怎么玩都可以!

今天松哥来和大家介绍一下 Spring Security 中四种常见的权限控制方式。

表达式控制 URL 路径权限

表达式控制方法权限

使用过滤注解

动态权限

四种方式,我们分别来看。

1.表达式控制 URL 路径权限

首先我们来看第一种,就是通过表达式控制 URL 路径权限,这种方式松哥在之前的文章中实际上和大家讲过,这里我们再来稍微复习一下。

Spring Security 支持在 URL 和方法权限控制时使用 SpEL 表达式,如果表达式返回值为 true 则表示需要对应的权限,否则表示不需要对应的权限。提供表达式的类是 SecurityExpressionRoot:

可以看到,SecurityExpressionRoot 有两个实现类,表示在应对 URL 权限控制和应对方法权限控制时,分别对 SpEL 所做的拓展,例如在基于 URL 路径做权限控制时,增加了 hasIpAddress 选项。

我们来看下 SecurityExpressionRoot 类中定义的最基本的 SpEL 有哪些:

可以看到,这些都是该类对应的表达式,这些表达式我来给大家稍微解释下:

表达式

备注

hasRole

用户具备某个角色即可访问资源

hasAnyRole

用户具备多个角色中的任意一个即可访问资源

hasAuthority

类似于 hasRole

hasAnyAuthority

类似于 hasAnyRole

permitAll

统统允许访问

denyAll

统统拒绝访问

isAnonymous

判断是否匿名用户

isAuthenticated

判断是否认证成功

isRememberMe

判断是否通过记住我登录的

isFullyAuthenticated

判断是否用户名/密码登录的

principle

当前用户

authentication

从 SecurityContext 中提取出来的用户对象

这是最基本的,在它的继承类中,还有做一些拓展,我这个我就不重复介绍了。

如果是通过 URL 进行权限控制,那么我们只需要按照如下方式配置即可:

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/admin/**").hasRole("admin")

.antMatchers("/user/**").hasAnyRole("admin", "user")

.anyRequest().authenticated()

.and()

...

}

这里表示访问 /admin/** 格式的路径需要 admin 角色,访问 /user/** 格式的路径需要 admin 或者 user 角色。

2.表达式控制方法权限

当然,我们也可以通过在方法上添加注解来控制权限。

在方法上添加注解控制权限,需要我们首先开启注解的使用,在 Spring Security 配置类上添加如下内容:

@Configuration

@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)

public class SecurityConfig extends WebSecurityConfigurerAdapter {

...

...

}

这个配置开启了三个注解,分别是:

@PreAuthorize:方法执行前进行权限检查

@PostAuthorize:方法执行后进行权限检查

@Secured:类似于 @PreAuthorize

这三个结合 SpEL 之后,用法非常灵活,这里和大家稍微分享几个 Demo。

@Service

public class HelloService {

@PreAuthorize("principal.username.equals('javaboy')")

public String hello() {

return "hello";

}

@PreAuthorize("hasRole('admin')")

public String admin() {

return "admin";

}

@Secured({"ROLE_user"})

public String user() {

return "user";

}

@PreAuthorize("#age>98")

public String getAge(Integer age) {

return String.valueOf(age);

}

}

第一个 hello 方法,注解的约束是,只有当前登录用户名为 javaboy 的用户才可以访问该方法。

第二个 admin 方法,表示访问该方法的用户必须具备 admin 角色。

第三个 user 方法,表示方法该方法的用户必须具备 user 角色,但是注意 user 角色需要加上 ROLE_ 前缀。第四个 getAge 方法,表示访问该方法的 age 参数必须大于 98,否则请求不予通过。

可以看到,这里的表达式还是非常丰富,如果想引用方法的参数,前面加上一个 # 即可,既可以引用基本类型的参数,也可以引用对象参数。

缺省对象除了 principal ,还有 authentication(参考第一小节)。

3.使用过滤注解

Spring Security 中还有两个过滤函数 @PreFilter 和 @PostFilter,可以根据给出的条件,自动移除集合中的元素。

@PostFilter("filterObject.lastIndexOf('2')!=-1")

public List getAllUser() {

List users = new ArrayList<>();

for (int i = 0; i < 10; i++) {

users.add("javaboy:" + i);

}

return users;

}

@PreFilter(filterTarget = "ages",value = "filterObject%2==0")

public void getAllAge(List ages,List users) {

System.out.println("ages = " + ages);

System.out.println("users = " + users);

}

在 getAllUser 方法中,对集合进行过滤,只返回后缀为 2 的元素,filterObject 表示要过滤的元素对象。

在 getAllAge 方法中,由于有两个集合,因此使用 filterTarget 指定过滤对象。

4.动态权限

动态权限主要通过重写拦截器和决策器来实现,这个我在 vhr 的文档中有过详细介绍,大家在公众号【江南一点雨】后台回复 888 可以获取文档,我就不再赘述了。

5.小结

好啦,今天就喝小伙伴们稍微聊了一下 Spring Security 中的授权问题,当然这里还有很多细节,后面松哥再和大家一一细聊。

到此这篇关于详解Spring Security 中的四种权限控制方式的文章就介绍到这了,更多相关Spring Security 权限控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java按钮权限控制_详解Spring Security 中的四种权限控制方式相关推荐

  1. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

    详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC  ...

  2. springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  3. java springmvc权限校验_详解Spring MVC使用Filter实现登录及权限验证判断

    登录和权限验证判断在后台管理系统中是最常用的功能,这部分代码是比较固定和独立的,为了减少对业务代码入侵性,一般我会考虑使用Filter来实现,下面我就来详细说一下我的实现思路和代码: 前台页面: St ...

  4. java全局异常处理_详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  5. 详解Spring Security的formLogin登录认证模式

    详解Spring Security的formLogin登录认证模式 一.formLogin的应用场景 在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模 ...

  6. Spring框架学习教程,详解Spring注入bean的几种方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...

  7. java中的json_JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  8. 详解MySQL双活同步复制四种解决方案

    详解MySQL双活同步复制四种解决方案 参考文章: (1)详解MySQL双活同步复制四种解决方案 (2)https://www.cnblogs.com/wuchangsoft/p/10390552.h ...

  9. vue路由跳转写法在html,详解vue 路由跳转四种方式 (带参数)

    1.  router-link 1. 不带参数 //name,path都行, 建议用name // 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由 ...

最新文章

  1. 最新dnsmasq安装部署详解(centos6)
  2. dpo指标详解买入绝技_巴菲特点破A股市场:5年前5178点买入5万元上峰水泥股票,持有到现在会有怎样的收益?从贫穷到富有...
  3. 计算机音乐数字乐谱核爆神曲,原神乐谱核爆神曲
  4. error C2664: “wcscpy”: 不能将参数 1 从“LPSTR”转换为“wchar_t *”
  5. SpringCloud教程-分布式配置中心Config (SpringCloud版本Greenwich.SR4)
  6. c# 分类 机器学习_C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”...
  7. 蒙特卡洛模拟预测股票_使用蒙特卡洛模拟来预测极端天气事件
  8. 全国高校计算机考试用的什么版本,全国高校计算机等级考试与全国计算机等级考试,有区别吗...
  9. java动态代理_Java中的动态代理一
  10. UIWebView捕获内部web点击事件
  11. logit回归怎么看显著性_spss logistic回归分析结果如何分析
  12. ANE for Android Setp by Step
  13. 小米电视看普通电视台,只需几步就能轻松解锁
  14. 成都个人公司不注销有什么后果?
  15. 努力赚钱,是为了不让自己的爱情受到别人金钱的考验
  16. 程序员的一百万种变现方式之1,努力多赚零花钱
  17. 2020年Java面试题及答案_Java面试宝典_Java笔试题(持续更新中)
  18. 斗战神服务器正在维护6,斗战神3月16日维护更新内容及修改BUG
  19. 上拉电阻与下拉电阻总结 与 GPIO框图分析
  20. OmniPlan 3破解码

热门文章

  1. hibernate 标识符_Hibernate中的标识符
  2. dynamodb容器使用_使用DynamoDB映射器将DynamoDB项目映射到对象
  3. java源文件编译成jar_从源文件和JAR文件构建Java代码模型
  4. java多线程做一件事_关于Java的十件事
  5. play框架配置 拦截器_如何使用Play框架为https配置SSL证书
  6. SMPP Java示例(客户端)
  7. 使用WebLogic共享库连续交付ADF应用程序
  8. Eclipse中的Tomcat:6个流行的“如何做”问题
  9. hadoop矩阵乘法源码_使用Hadoop计算共现矩阵
  10. 4g内存 堆内存分配多少_我需要多少内存