java安全权限配置_使用Spring安全表达式控制系统功能访问权限问题

一、SPEL表达式权限控制

从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。Spring Security可用表达式对象的基类是SecurityExpressionRoot。

表达式函数

描述

hasRole([role])

用户拥有指定的角色时返回true (Spring security默认会带有ROLE_前缀),去除前缀参考Remove the ROLE_

hasAnyRole([role1,role2])

用户拥有任意一个指定的角色时返回true

hasAuthority([authority])

拥有某资源的访问权限时返回true

hasAnyAuthority([auth1,auth2])

拥有某些资源其中部分资源的访问权限时返回true

permitAll

永远返回true

denyAll

永远返回false

anonymous

当前用户是anonymous时返回true

rememberMe

当前用户是rememberMe用户返回true

authentication

当前登录用户的authentication对象

fullAuthenticated

当前用户既不是anonymous也不是rememberMe用户时返回true

hasIpAddress('192.168.1.0/24'))

请求发送的IP匹配时返回true

部分朋友可能会对Authority和Role有些混淆。Authority作为资源访问权限可大可小,可以是某按钮的访问权限(如资源ID:biz1),也可以是某类用户角色的访问权限(如资源ID:ADMIN)。当Authority作为角色资源权限时,hasAuthority('ROLE_ADMIN')与hasRole('ADMIN')是一样的效果。

二、SPEL在全局配置中的使用

我们可以通过继承WebSecurityConfigurerAdapter,实现相关的配置方法,进行全局的安全配置(之前的章节已经讲过) 。下面就为大家介绍一些如何在全局配置中使用SPEL表达式。

2.1.URL安全表达式

config.antMatchers("/system/*").access("hasAuthority('ADMIN') or hasAuthority('USER')")

.anyRequest().authenticated();

这里我们定义了应用/person/*URL的范围,只有拥有ADMIN或者USER权限的用户才能访问这些person资源。

2.2.安全表达式中引用bean

这种方式,比较适合有复杂权限验证逻辑的情况,当Spring Security提供的默认表达式方法无法满足我们的需求的时候。首先我们定义一个权限验证的RbacService。

@Component("rbacService")

@Slf4j

public class RbacService {

//返回true表示验证通过

public boolean hasPermission(HttpServletRequest request, Authentication authentication) {

//验证逻辑代码

return true;

}

public boolean checkUserId(Authentication authentication, int id) {

//验证逻辑代码

return true;

}

}

对于"/person/{id}"对应的资源的访问,调用rbacService的bean的方法checkUserId进行权限验证,传递参数为authentication对象和person的id。该id为PathVariable,以#开头表示。

config.antMatchers("/person/{id}").access("@rbacService.checkUserId(authentication,#id)")

.anyRequest().access("@rbacService.hasPermission(request,authentication)");

三、 Method表达式安全控制

如果我们想实现方法级别的安全配置,Spring Security提供了四种注解,分别是@PreAuthorize , @PreFilter , @PostAuthorize 和 @PostFilter

3.1.开启方法级别注解的配置

在Spring安全配置代码中,加上EnableGlobalMethodSecurity注解,开启方法级别安全配置功能。

@Configuration

@EnableGlobalMethodSecurity(prePostEnabled = true)

public class MySecurityConfig extends WebSecurityConfigurerAdapter {

3.2 使用PreAuthorize注解

@PreAuthorize 注解适合进入方法前的权限验证。只有拥有ADMIN角色才能访问findAll方法。

@PreAuthorize("hasRole('ADMIN')")

List findAll();

3.3 使用PostAuthorize注解

@PostAuthorize 在方法执行后再进行权限验证,适合根据返回值结果进行权限验证。Spring EL 提供返回对象能够在表达式语言中获取返回的对象returnObject。下文代码只有返回值的name等于authentication对象的name才能正确返回,否则抛出异常。

@PostAuthorize("returnObject.name == authentication.name")

Person findOne(Integer id);

3.4 使用PreFilter注解

PreFilter 针对参数进行过滤,下文代码表示针对ids参数进行过滤,只有id为偶数才能访问delete方法。

//当有多个对象是使用filterTarget进行标注

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

public void delete(List ids, List usernames) {

3.5 使用PostFilter 注解

PostFilter 针对返回结果进行过滤,特别适用于集合类返回值,过滤集合中不符合表达式的对象。

@PostFilter("filterObject.name == authentication.name")

List findAll();

总结

以上所述是小编给大家介绍的使用Spring安全表达式控制系统功能访问权限问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SlidingMenu的使用,结合Fragment(eclipse环境)

首先下载SlidingMenu,有Library和Sample,然后在自己的项目中引入类库(引入智慧北京工作空间的Library),然后V4包会发生冲突,删掉自己项目Libs目录下的V4包即可 侧滑布局和主界面布局都先用一个空布局填充一…

log4j日志文件配置说明及使用

一.log4j.properties文件格式说明: log4j.rootLoggerinfo, stdoutlog4j.appender.stdoutorg.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layoutorg.apache.log4j.PatternLayout# Pattern to output the callers file name and line number.log4j.appende…

java如何做全局缓存_传智播客JNI第七讲 – JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式...

讲解JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式,并编写两种缓存方式的示例代码。1.从Java虚拟机创建的对象传到本地C/C代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会出发该引用指向的Java对象…

起一卦,还是那个破事。还是大凶。

公元:2013年6月20日11时48分46秒 阳3局农历:2013年05月12日11时48分芒种:2013-6-5 20:44:00 小暑:2013-7-7 7:09:00干支:癸巳年 戊午月 丁巳日 丙午时 旬空:午未空 子丑空 子丑空 寅卯空直符&#…

老工业基地调整改造与振兴

老工业基地调整改造与振兴 一、运用“两只手”,加快工业结构调整 一方面,运用市场机制即“看不见的手”进行调整。通过市场竞争机制、价格波动机纠、供求均衡机制、优胜劣汰机制等,实现资源的合理流动和优化配置。 另一方面,运用宏…

如何使用DNS反向映射来扫描IPv6地址?

目前增加的IPv6地址空间不仅提高了对启发式算法的使用(执行IPv6地址扫描时),而且还推动了人们探索替代技术用于查找IPv6节点。本文中我们将探讨如何使用一种极其强大的向量来发现IPv6节点:使用DNS反向映射。 IPv6地址扫描攻击通常…

java jre下载安装教程_java JRE下载、安装以及环境变量教程

java JRE下载、安装以及环境变量教程作者:小丸子 来源:PC下载网时间:2017-10-17 19:12:33JRE也就是(Java Runtime Environment)Java运行环境,是运行JAVA程序所必须的环境的集合,包含各种类库。今天PC下载网小编为您介绍jre的下载 安装 跟环境变量的配置1…

java环境变量设置与java查看安装路径

把jdk安装到计算机中之后,我们来进行设置使java环境能够使用。 首先右键点我的电脑。打开属性。然后选择“高级”里面的“环境变量”,在新的打开界面中的系统变量需要设置三个属性“JAVA_HOME”、 “path”、“classpath”,其中在没安装过jdk的环境下。p…

C#设计模式学习笔记-单例模式

C#设计模式学习笔记-单例模式 最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记。 在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定义是&…

kotlin为什么比java编译慢_为什么Kotlin编译速度比Scala快? [关闭]

虽然我认为这个问题不适合Stack Overflow,因为它倾向于主要产生基于意见的答案,但这里有一个尝试:你有两种不同的语言,特别是关于类型系统,以及两个完全独立的编译器实现 . 所以期望它们具有“相同”的编译速度已经是一…

锡山国土推行数据中心“在线变更”

为全面提高全区土地变更工作效率,国土锡山分局全面推行数据中心在线变更。由不动产登记科利用数据中心管理平台,将遥感影像、监测信息以及监测图斑的土地利用现状信息、土地利用总体规划信息录入“数据中心”,制定我区的变更调查工作方案&…

Linux 安装loadrunner 碰到的问题

关于linux下面搭建loadrunner的详细步骤: http://blog.sina.com.cn/s/blog_9aa583cf0101bu4y.html http://hi.baidu.com/higkoo/item/d75027acc78bab3e030a4dde?qq-pf-topcqq.c2c http://www.cnblogs.com/xiaoTT/archive/2012/02/15/2352127.html 用控制台加载负载…

数据分析真的能驱动用户快速增长吗?

俗话说,“酒香不怕巷子深”;俗话又说,“酒香也怕巷子深” 。再后来,俗话还说,管他酒香不香巷子深不深,只要找个算盘技巧神乎其神的账房先生,即数据科学家,酒就可以大卖了。这叫做用数据驱动用户…

java 常见bug_java常见bug

org.hibernate.QueryException: could not resolve property: menuId of:无法解析menuId 字段,是指这个字段有错Servlet.service() for servlet default threw exception09:28:54,704 ERROR [CoyoteAdapter] An exception or error occurred in the container durin…

解决启动Biee控制台乱码问题

解决启动Biee控制台乱码问题 在安装完Biee后,大家都可以看到在程序中可以找到启动BI服务的地方 点击上图中的启动bi服务则在window系统中会弹出一个dos窗口,来显示执行启动服务的操作,如下图 上图显示的是正常情况,本人安装后首次…

“北航Clubs” Alpha版发布!

一、功能 1.获取活动信息: 用户进入网站后,第一眼就可以查看到近期活动 2.查看活动详情 点击活动标题,可以进入活动详情页面 3.注册功能 首页点击注册,输入学号、密码、姓名、手机号即可完成注册 4.用户登陆 拥有账号之后&#xf…

物联网与零边际成本共享经济

物联网是由通讯网络、能源网络、物流网络组成,这些网络共同在单一操作系统中合作,持续寻找各种方法来提升资源整编、生产及配送商品和服务,以及废弃物回收等过程中的热力效率和生产力;这三种网络相辅相成,缺一不可。若缺乏通讯&am…

C++程序设计教程学习(1)-第一部分 编程基础

第一章 概述 C到底难不难学?没有学不会的事情 1.1 程序设计语言 语言 编程语言 人和计算机交流的工具,群体扩大,人人间交流过程描述与信息表达的工具 机器语言,汇编语言,高级语言 1.2 C简史 1.3 C 褒贬C 计算机应用范围…

《Programming WPF》翻译 第9章 6.我们进行到哪里了?

《Programming WPF》翻译 第9章 6.我们进行到哪里了? 原文:《Programming WPF》翻译 第9章 6.我们进行到哪里了?只有当任何内嵌控件都没有提供你需要的底层行为时,你将要写一个自定义控件。当你写一个自定义控件,你将要使用到依赖…

php实现上传,PHP实现文件上传例子

实例1:上载文件表单网页:updatefile.htm上载文件表单请选取文件:[CtrlA 全部选择 然后拷贝]处理上载文件网页:updatefile.php3处理上载文件copy($userfile, "newfilename");echo $userfile." - 用户上传到服务器上的文件临时存…