shiro学习(6)-ssm整合-授权+缓存_禅悟刂的博客-程序员宅基地

技术标签: shiro  

授权具体实现

授权

	/**
	 * 授权
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		//从认证器中得到CurrentUser对象
		CurrentUser user = (CurrentUser)principals.getPrimaryPrincipal();
		//通过用户ID查询到对应的权限表示符
		List<String> userPermission = userDao.findUserPermissions(user.getUserid());
		//将list转为set
		Set<String> set = new HashSet<String>();
		for(String c : userPermission){
			if(c!=null && !("".equals(c))){
				set.add(c);
			}
		}
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		info.addStringPermissions(set);
		System.out.println("=====================================================>>>>>>>>>>");
		return info;
	}

授权配置

   在SpringMVC的配置文件中开启shiro注解

添加依赖


<!-- Aop -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.7</version>
</dependency>

<!-- shiro整合ehcache缓存管理器 -->

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.3.1</version>
</dependency>

springMVC配置文件

  <!-- 基于注解权限控制  基于类的代理  -->
     <aop:config proxy-target-class="true"></aop:config>

spring-shiro.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" 
	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:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
	http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- 配置web.xml中过滤器对应的spring容器的bean -->
	<bean id="shiro" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" >
		<!-- 注册SecurityManager  -->
		<property name="securityManager" ref="securityManager"></property>
		<!-- 登录时访问的链接 -->
		<property name="loginUrl" value="/loginUI"></property>
		<!-- 用户无权限时需要访问的页面 -->
		<property name="unauthorizedUrl" value="/errorUI"></property>
		<!-- 设置 过滤器链 -->
		<property name="filterChainDefinitions">
			<value>
				/bootstrap/** = anon
				/dist/** = anon
				/images/** = anon
				/jquery/** = anon
				/tzms/** = anon
				<!-- 所有请求匿名访问  /** = anon -->
				<!-- 点击登录 不需要认证 -->
				/login = anon
				<!-- 退出 此方法会清空shiro中session的数据 -->
				/logout = logout
				<!-- 所有的url都必须要认证通过后才可以访问 -->
				/** = authc
			</value>
		</property>
	</bean>
	
	<!-- 配置安全管理器对象 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<!-- 配置自定义数据源 -->
		<property name="realm" ref="shiroUserRealm"></property>
		<!-- 配置缓存 -->
		<property name="cacheManager" ref="ehCacheManager"></property>
	</bean>
	
	<!-- 配置自定义Realm -->
	<bean id="shiroUserRealm" class="com.tanzhou.tzms.common.service.impl.ShiroRealmsOne">
		<!-- 配置凭证匹配器 -->
		<property name="credentialsMatcher" ref="credentialsMatcher"></property>
	</bean>
	
	<!-- 定义凭证匹配器 -->
	<bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
		<!-- 匹配散列算法 -->
		<property name="hashAlgorithmName" value="MD5"></property>
		<!-- 匹配散列次数 -->
		<property name="hashIterations" value="1"></property>
	</bean>
	
	<bean id="advisor" class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager"></property>
	</bean>
	
	<!-- 配置缓存管理器 -->
	<bean id="ehCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
		<!-- 配置缓存管理文件 -->
		<property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"></property>
	 </bean>
</beans>

shrio-ehcache.xml缓存配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <!--
       diskStore:为缓存路径,ehcache分为内存和磁盘两级,
       	此属性定义磁盘的缓存位置。参数解释如下:
     -->
    <diskStore path="F:\ehcache"/>
    <!--
       defaultCache:默认缓存策略
     -->
    <!--
      maxElementsInMemory:缓存最大数目
      maxElementsOnDisk:硬盘最大缓存个数。
      eternal:对象是否永久有效,一但设置了,timeout将不起作用。
      overflowToDisk:是否保存到磁盘,当系统当机时
      timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
      timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
      diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
      diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
      diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
      memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
      clearOnFlush:内存数量最大时是否清除。
      memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
      FIFO,first in first out,这个是大家最熟的,先进先出。
      LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
      LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
   -->
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="true"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>
</ehcache>

基于注解式资源授权验证

清空缓存

在自定义Realm中添加清空方法

/**
 * 清空缓存
 */
public void clearCache(){
	PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
	super.clearCache(principals);
}

添加业务处理方法

 第一次正常请求会授权,之后访问从缓存中获取。当调用清空缓存方法后,再次请求的时候因为缓存已经空了,所以会再次授权,
  场景: 权限修改生效后,立即刷新清空缓存,则可以实现用户不退出生效新的权限

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42575310/article/details/103386505

智能推荐

Linux下postgresql安装_绫里千寻的博客-程序员宅基地

一、配置Apt Repository:echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" >> /etc/apt/sources.list.d/pgdg.listsudo apt-get install software-properties-common (没有wget则需要安装依赖)sudo ap

前端实习面试常考(浮动的影响、清除浮动、BFC )_小林搞前端的博客-程序员宅基地

一、浮动的影响在学习清除浮动之前要理解浮动,所谓浮动就是让元素“漂浮”在文档流之上(什么是文档流关注我的另一篇),也就是脱离文档流。既然叫“浮动”,就是说元素是漂浮的,那元素的下方空间就是可用的,其他的非浮动元素会“当它不存在”。浮动元素的这种特性,会造成两方面的不利影响:第一:大家都知道,如果不给父元素设置宽高的话,父元素会被子元素撑开。而如果子元素设置了浮动,那它将会“漂浮”在“上面”,在“下面”的父元素会“当它不存在”,那么子元素就无法撑开父元素,父元素就没有了高度,这就是大家常说的“父元素高度塌

System.nanoTime()的使用_weixin_34126215的博客-程序员宅基地

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

UIViewController生命周期_1奋斗的小鸟1的博客-程序员宅基地

序言:loadView、viewDidLoad、viewDidAppear、initWithNibName、awakeFromNib等经常出现在UIViewController中的方法介绍。这些方法分别用来作哪些工作,换言之,创建自定义的View时代码放到以上哪个方法中。一个UIView的生命周期是怎样的。以上几个方法的调用顺序如何。通过IB和代码加载视图,有什么区别文章主要参考官

80后阿里P10,“关老板”如何带着MaxCompute一路升级?_weixin_34185512的博客-程序员宅基地

我是个幸运的人。虽然幸运不能被复制,但是眼光和努力可以。关涛/关老板,80后的阿里P10,阿里巴巴通用计算平台负责人,阿里巴巴计算平台研究员。12年职场人生,微软和阿里的选择。关涛的花名取自谐音:观涛。有种看海观涛的闲适,但在MaxCompute技术团队里,因为团队既要做核心技术也要“落地拿结果”承担阿里云的客户规模和营收,像一个小的创业公司,因此大家...

gitlab安装,使用,备份,恢复_weixin_34072159的博客-程序员宅基地

gitlab安装,使用,备份,恢复git是一个版本控制器在分布式版本控制系统里,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。1.gitlab介绍GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并...

随便推点

Android KK开机按power键不能灭屏,须过会儿才能灭屏_weixin_30607659的博客-程序员宅基地

这是Google issue,原生Android4.4都有此问题。流程是:AMS发出BOOT_COMPLETED,PowerManager收到BOOT_COMPLETED后checkBoot animation是否完成,如果完成,就会将内部的成员mBootCompleted置为true,之后再按power键才会正常休眠。PowerManagerService.java在systemRead...

对企业虚拟化发展方向的几点拙见_weixin_34038293的博客-程序员宅基地

笔者接触虚拟化也有几年时间了,04年开始在自己电脑上研究VMware Workstation,06年在一个项目中开始接触VMware GSX,ESX和IBM刀片服务器,07年开始在企业生产环境部署虚拟化应用。在这里总结了一些对企业虚拟化发展前景的认识,和大家分享: 1)虚拟机的平台 目前虚拟化平台“层出不穷”,除了VMware,Microsoft和...

因子数_爱吃猫的鱼的博客-程序员宅基地

求因子个数方法一:约数个数定理:O(√n)ll get_num(ll n) { ll tot=1; for(ll i=2; i*i&lt;=n; ++i) { if(n%i==0) { ll x=0; while(n%i==0) { n/=i; x++; } tot*=(x+1); } } if(n&gt;1)tot*=2; retur...

使用PLSQL Developer来实现不同数据库的表结构以及表数据同步_springInJava的博客-程序员宅基地

今天第一天到新公司上班,装了个最新版的PLSQL Developer(7.1.5),仔细看了下有什么改进,居然在tools菜单下发现了有Compart Table Data功能,试用了,感觉很爽,特记录下来! 1,tools/compare user objects      该功能用于比较不同用户所拥有的对象,包括table,function,procedure,view等,并生

力扣14.最长公共前缀_赟家小菜鸟的博客-程序员宅基地

题目: 传送门题意: 题目给出多个字符串,求出字符串的最长公共前缀,我们要知道字符前缀是什么,我们举个例子:字符串s:“abcdef” ,那么字符串的前缀有:[“a”,“ab”,“abc”,“abcd”,“abcde”,“abcdef”],字符串前缀的意思是从字符串的第一个开始,现在求这些字符串的最长公共前缀我们只需要将两个字符串的最长公共前缀保存成一个字符串,然后和其他字符串一次求最长公共前缀,如何求最长公共前缀呢?我只需要一个while循环就可以了:string Solution::longFi

java tablecelleditor_java – JComboBox作为自定义TableCellEditor_susieforever的博客-程序员宅基地

我强烈建议使用具有ComboBoxCellEditor组件的SwingX.它本质上是Sun的Swing组件应具备的功能的孵化器.我不知道该项目是否仍在积极开发,但它已经成熟,我已经在许多项目中使用过它.如果出于某种原因,您不能或不想使用外部库,这里是他们的代码(修改了部分以删除自定义SwingX功能),注释完好无损:注意:该库是GPL代码./** $Id: ComboBoxCellEditor.j...

推荐文章

热门文章

相关标签