通过shiro进行按钮及页面访问url的权限控制
1.当面我们每次登录系统时,都会通过我们自己定义的继承AuthorizingRealm的ShiroRealm进行用户账号密码的确认以及拥有权限的查询:
(1)自定义shiroReam:
public class ShiroDbRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;@Autowiredprivate SysUserService sysUserService ;@Autowiredprivate SysUserResService sysUserResService ;public ShiroDbRealm() {super();}/*** 验证登陆*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)throws AuthenticationException {UsernamePasswordToken token = (UsernamePasswordToken) authcToken;SysUser sysUser = sysUserService.getUserByLoginName(token.getUsername()) ;//根据登录名获取用户信息if (sysUser != null) {return new SimpleAuthenticationInfo(sysUser.getUserNo(), sysUser.getUserPwd(), getName());} else {throw new AuthenticationException();}}/*** 登陆成功之后,进行角色和权限验证*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String userNo = (String) getAvailablePrincipal(principals);// 列举此用户所有的权限//List<Permission> permissions = userService.findUserPermissionByName(username);List<SysUserRes> listRes = sysUserResService.getPermissionByNo(userNo) ;Set<String> strs=new HashSet<String>();Iterator<SysUserRes> it = listRes.iterator();while (it.hasNext()) {SysUserRes re=it.next();strs.add(re.getResUrl());}SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();authorizationInfo.addStringPermissions(strs);return authorizationInfo;}/*** 清除所有用户授权信息缓存.*/public void clearCachedAuthorizationInfo(String principal) {SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());clearCachedAuthorizationInfo(principals);}/*** 清除所有用户授权信息缓存.*/public void clearAllCachedAuthorizationInfo() {Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();if (cache != null) {for (Object key : cache.keys()) {cache.remove(key);}}}/*** * @Title: clearAuthz * @Description: TODO 清楚缓存的授权信息 * @return void 返回类型*/public void clearAuthz(){this.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals());}
}
(2)通过siro进行处理:shiro的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd http://www.springframework.org/schema/context classpath:org/springframework/context/config/spring-context-3.0.xsdhttp://www.springframework.org/schema/aop classpath:org/springframework/aop/config/spring-aop-3.0.xsdhttp://www.springframework.org/schema/tx classpath:org/springframework/transaction/config/spring-tx-3.0.xsdhttp://www.springframework.org/schema/util classpath:org/springframework/beans/factory/xml/spring-util-3.0.xsd"default-lazy-init="true"><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="realm" ref="shiroDbRealm" /><property name="cacheManager" ref="shiroCacheManager" /></bean><!-- 項目自定义的Realm --><bean id="shiroDbRealm" class="com.creidtsys.security.realm.ShiroDbRealm"><!-- <property name="credentialsMatcher"><bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"><property name="hashAlgorithmName" value="MD5"/></bean></property> --></bean><!-- Shiro Filter --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager" /><property name="loginUrl" value="/page/login" /><property name="successUrl" value="/page/index" /><property name="unauthorizedUrl" value="/page/noPers" /><!-- <property name="filters"><util:map><entry key="authc"><bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"/></entry></util:map></property> --><property name="filterChainDefinitions"><value>/sysUser/checkLogin = anon/login = anon/index = anon/page/** = anon<!-- 要拦截的url --><!-- 用户权限拦截 -->/sysUser/list= perms["user:serch"]/sysUser/toAdd = perms["user:add"]/sysUser/toEdit = perms["user:update"]<!-- 角色权限拦截 -->/sysRole/list=perms["role:serch"]/sysUser/toAdd = perms["role:add"]/sysUser/toEdit = perms["role:update"]<!-- 部门权限拦截 -->/sysDept/list = perms["dept:serch"]/sysDept/toAdd = perms["dpt:add"]/sysDept/toEdit = perms["dept:edit"]<!-- 资源权限拦截 -->/sysRes/list = perms["res:serch"]/sysRes/toAdd = perms["res:add"]/sysRest/toEdit = perms["res:edit"]</value></property></bean> <!-- 用户授权信息Cache org.apache.shiro.cache.ehcache.EhCacheManager--><bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"><property name="cacheManager" ref="ehCacheManager" /></bean><!-- 保证实现了Shiro内部lifecycle函数的bean执行 --><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /><!-- AOP式方法级权限检查 --><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"depends-on="lifecycleBeanPostProcessor"></bean><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager" /></bean></beans>
(3)拦截配置说明:
anon:例子/admins/**=anon 没有参数,表示可以匿名使用。
authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数
roles:例子/admins/user/=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/=roles[“admin,guest”],每个参数通过才算通过,相当于hasAllRoles()方法。
perms:例子/admins/user/=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/=perms[“user:add:,user:modify:”],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
rest:例子/admins/user/=rest[user],根据请求的方法,相当于/admins/user/=perms[user:method] ,其中method为post,get,delete等。
port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。
authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证
ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https
user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查
注:anon,authcBasic,auchc,user是认证过滤器,
perms,roles,ssl,rest,port是授权过滤器
(4)我的配置:
/sysRes/list = perms[“res:serch”]
/sysRes/toAdd = perms[“res:add”]
/sysRest/toEdit = perms[“res:edit”]
如果你想要访问主界面(/sysRes/list)就必修又有[“res:serch”]的权限
如果你想要跳转到添加界面(/sysRes/toAdd),就必须拥有[“res:add”]的权限
如果你想跳转到修改界面(/sysRest/toEdit),就必须拥有[“res:edit”]的权限
2.按钮权限的控制就显得简单了,只需要通过shiro的标签就轻而易举的解决了:
<div data-options="region:'center'"><div id="tb" style="padding-bottom: 5px"><input id="queryName" class="easyui-textbox"/><a id="querybtn" class="easyui-linkbutton" data-options="iconCls:'icon-search'">查询</a><shiro:hasPermission name="res:add"><a id="addbtn" class="easyui-linkbutton" data-options="iconCls:'icon-add'">新增</a></shiro:hasPermission><shiro:hasPermission name="res:edit"><a id="editbtn" class="easyui-linkbutton" data-options="iconCls:'icon-edit'">修改</a> </shiro:hasPermission><shiro:hasPermission name="res:delete"><a id="delbtn" class="easyui-linkbutton" data-options="iconCls:'icon-remove'">删除 </a></shiro:hasPermission></div>
3.补充点:
身份验证相关的
授权相关的
其他
Shiro 标签
Shiro 提供了 JSTL 标签用于在 JSP 页面进行权限控制,如根据登录用户显示相应的页面按钮。
guest 标签:用户没有身份验证时显示相应信息,即游客访问信息:
user 标签:用户已经经过认证/记住我登录后显示相应的信息。
Shiro 标签
authenticated 标签:用户已经身份验证通过,即Subject.login登录成功,不是记住我登录的
notAuthenticated 标签:用户未进行身份验证,即没有调用Subject.login进行登录,包括记住我自动登录的也属于
未进行身份验证。
pincipal 标签:显示用户身份信息,默认调用Subject.getPrincipal() 获取,即 Primary Principal。
hasRole 标签:如果当前 Subject 有角色将显示 body 体内容:
hasAnyRoles 标签:如果当前Subject有任意一个角色(或的关系)将显示body体内容。
lacksRole:如果当前 Subject 没有角色将显示 body 体内容
hasPermission:如果当前 Subject 有权限将显示 body 体内容
lacksPermission:如果当前Subject没有权限将显示body体内容。
权限注解
@RequiresAuthentication:表示当前Subject已经通过login进行了身份验证;即 Subject. isAuthenticated() 返回 true
@RequiresUser:表示当前 Subject 已经身份验证或者通过记住我登录的。
@RequiresGuest:表示当前Subject没有身份验证或通过记住我登录过,即是游客身份。
@RequiresRoles(value={“admin”, “user”}, logical=Logical.AND):表示当前 Subject 需要角色 admin 和user
@RequiresPermissions (value={“user:a”, “user:b”},logical= Logical.OR):表示当前 Subject 需要权限 user:a 或user:b。
自定义拦截器
通过自定义拦截器可以扩展功能,例如:动态url-角色/权限访问控制的实现、根据 Subject 身份信息获取用户信息绑定到 Request(即设置通用数据)、验证码验证、在线用户信息的保存等
会话相关的 API
Subject.getSession():即可获取会话;其等价于Subject.getSession(true),即如果当前没有创建 Session 对象会创建
一个;Subject.getSession(false),如果当前没有创建 Session 则返回null
session.getId():获取当前会话的唯一标识
session.getHost():获取当前Subject的主机地址
session.getTimeout() & session.setTimeout(毫秒):获取/设置当前Session的过期时间
session.getStartTimestamp() & session.getLastAccessTime():获取会话的启动时间及最后访问时间;如果是 JavaSE 应用需要自己定期调用 session.touch() 去更新最后访问时间;如果是Web 应用,每次进入 ShiroFilter 都会自动调用 session.touch() 来更新最后访问时间。
session.touch() & session.stop():更新会话最后访问时间及销毁会话;当Subject.logout()时会自动调用 stop 方法来销毁会话。如果在web中,调用 HttpSession. invalidate()也会自动调用Shiro Session.stop 方法进行销毁Shiro 的会话
session.setAttribute(key, val) &session.getAttribute(key) &session.removeAttribute(key):设置/获取/删除会话属性;在整个会话范围内都可以对这些属性进行操作
通过shiro进行按钮及页面访问url的权限控制相关推荐
- JAVA入门级教学之(访问修饰符权限控制)
访问控制权限修饰符: 1.访问控制权限修饰符来控制元素的访问范围 public 表示公开的,在任何位置都可以访问 protected 同包.本类.子类(出了包如果是子类没问题) 缺省 同包.本类(不能 ...
- Java API访问ZK的权限控制
无权限访问结点 /*** 对于ZK的授权访问* Created by liuhuichao on 2017/7/27.*/ public class AutoSample {private stati ...
- shiro进行权限控制的四种方式
我们使用shiro进行权限控制 有以下几种方式 1. URL拦截权限控制:基于filter过滤器实现 我们在spring配置文件中配置shiroFilter时配置 /css/ = anon /js/ ...
- shiro 方法级别细粒度权限控制_Shiro的认证和权限控制
从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...
- 动态参数 maven_Spring Security 动态url权限控制(三)
一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- netcore权限控制_netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源...
基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理[精确到按钮]) 代码生成器 如何使用 代码克隆到本地 用vs2017或以上 ...
- 第6章 访问权限控制
2014-12-09 20:14:52 访问权限控制 1.访问权限控制出现的原因 代码需要不断的重新创作才能变得完善. 要完善的公用代码(如:类库)已经被客户程序使用,修改后,可能会影响客户程序的功能 ...
- ssm+shiro+jsp标签。关键字:shiro的jsp标签,访问拦截。本次ssm和以前的ssm整合中的依赖包不一样。写根据不同用户出现不同的按钮内容就用这shiro标签来解决。Set集合在sql中
shiro标签只能在jsp和ftl页面文件中使用,无法在html文件中使用 shiro认证后的在jsp页面中的标签: 使用shiro标签就一定要搭配shiro框架使用,即一定要有自定义realm,因为 ...
最新文章
- C语言中quot;##quot;的独特用法
- mysql自带加密解密字符集问题
- 解析取值_圆锥曲线——高中解析几何全归纳
- android两个java文件内容_java – 在1个请求中将多个文件从Android上传...
- 数据仓库工具箱维度建模权威指南-第一章 数据仓库、商业智能及维度建模初步
- 机器学习算法mini版
- apollo local 模式_Apollo开发者说丨使用GDB调试Apollo项目
- Linux Swap交换分区介绍
- 网吧服务器管理维护,网吧服务器常用设置维护工具
- takes 1 positional argument but 2 were given
- 苞米豆MyBatis-plus代码生成器
- vba九九乘法表代码_用五种方法利用EXCEL制作九九乘法表
- 搭建智能DNS---就近原则
- 复星联合超越保2020,升级了,但更便宜!
- 神同步的智能运维体系和世界杯442阵型
- cropper(图片裁剪插件)
- 双 JK 触发器 74LS112 逻辑功能。真值表_D触发器示例
- STM32cube 生成freertos 使用AC6编译器编译
- 尽一份孝心,为家人做一个老人防摔报警系统
- 常见的工作流引擎(osworkflow、jbpm、activiti、flowable、camunda)比较
热门文章
- 车牌分割python_OpencvPython实现车牌字符分割
- SQLAlchemy Column
- CPU、内核、逻辑处理器
- Python视频处理(1)——视频分镜头提取+视频处理
- html表格右侧边距,HTML表格标记教程(10):单元格边距属性CELLPADDING
- linux驱动开发-阻塞非阻塞
- 沈孝钧计算机算法基础答案,计算机算法基础教学课件ppt作者沈孝钧第14章-PPT-N2课件.pptx...
- 关于python安装pylab遇到的问题
- 软件测试需要什么学历?
- Js 中文显示星期几方法