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的权限控制相关推荐

  1. JAVA入门级教学之(访问修饰符权限控制)

    访问控制权限修饰符: 1.访问控制权限修饰符来控制元素的访问范围 public 表示公开的,在任何位置都可以访问 protected 同包.本类.子类(出了包如果是子类没问题) 缺省 同包.本类(不能 ...

  2. Java API访问ZK的权限控制

    无权限访问结点 /*** 对于ZK的授权访问* Created by liuhuichao on 2017/7/27.*/ public class AutoSample {private stati ...

  3. shiro进行权限控制的四种方式

    我们使用shiro进行权限控制 有以下几种方式 1. URL拦截权限控制:基于filter过滤器实现 我们在spring配置文件中配置shiroFilter时配置 /css/ = anon /js/ ...

  4. shiro 方法级别细粒度权限控制_Shiro的认证和权限控制

    从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...

  5. 动态参数 maven_Spring Security 动态url权限控制(三)

    一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...

  6. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  7. netcore权限控制_netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源...

    基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理[精确到按钮]) 代码生成器 如何使用 代码克隆到本地 用vs2017或以上 ...

  8. 第6章 访问权限控制

    2014-12-09 20:14:52 访问权限控制 1.访问权限控制出现的原因 代码需要不断的重新创作才能变得完善. 要完善的公用代码(如:类库)已经被客户程序使用,修改后,可能会影响客户程序的功能 ...

  9. ssm+shiro+jsp标签。关键字:shiro的jsp标签,访问拦截。本次ssm和以前的ssm整合中的依赖包不一样。写根据不同用户出现不同的按钮内容就用这shiro标签来解决。Set集合在sql中

    shiro标签只能在jsp和ftl页面文件中使用,无法在html文件中使用 shiro认证后的在jsp页面中的标签: 使用shiro标签就一定要搭配shiro框架使用,即一定要有自定义realm,因为 ...

最新文章

  1. C语言中quot;##quot;的独特用法
  2. mysql自带加密解密字符集问题
  3. 解析取值_圆锥曲线——高中解析几何全归纳
  4. android两个java文件内容_java – 在1个请求中将多个文件从Android上传...
  5. 数据仓库工具箱维度建模权威指南-第一章 数据仓库、商业智能及维度建模初步
  6. 机器学习算法mini版
  7. apollo local 模式_Apollo开发者说丨使用GDB调试Apollo项目
  8. Linux Swap交换分区介绍
  9. 网吧服务器管理维护,网吧服务器常用设置维护工具
  10. takes 1 positional argument but 2 were given
  11. 苞米豆MyBatis-plus代码生成器
  12. vba九九乘法表代码_用五种方法利用EXCEL制作九九乘法表
  13. 搭建智能DNS---就近原则
  14. 复星联合超越保2020,升级了,但更便宜!
  15. 神同步的智能运维体系和世界杯442阵型
  16. cropper(图片裁剪插件)
  17. 双 JK 触发器 74LS112 逻辑功能。真值表_D触发器示例
  18. STM32cube 生成freertos 使用AC6编译器编译
  19. 尽一份孝心,为家人做一个老人防摔报警系统
  20. 常见的工作流引擎(osworkflow、jbpm、activiti、flowable、camunda)比较

热门文章

  1. 车牌分割python_OpencvPython实现车牌字符分割
  2. SQLAlchemy Column
  3. CPU、内核、逻辑处理器
  4. Python视频处理(1)——视频分镜头提取+视频处理
  5. html表格右侧边距,HTML表格标记教程(10):单元格边距属性CELLPADDING
  6. linux驱动开发-阻塞非阻塞
  7. 沈孝钧计算机算法基础答案,计算机算法基础教学课件ppt作者沈孝钧第14章-PPT-N2课件.pptx...
  8. 关于python安装pylab遇到的问题
  9. 软件测试需要什么学历?
  10. Js 中文显示星期几方法