首页 > 其他分享 >shiro缓存

shiro缓存

时间:2023-02-08 11:32:40浏览次数:37  
标签:clearCached 缓存 realm 调用 授权 shiro


需求:针对上一个程序,授权频繁查询数据库,需要使用shiro缓存。



缓存流程

shiro中提供了对认证信息和授权信息的缓存。shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的。主要研究授权信息缓存,因为授权的数据量大。


用户认证通过。
该 用户第一次授权:调用realm查询数据库
该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符)。


1.使用ehcache内存框架

添加Ehcache的jar包(echache-core-2.5.0.jar和shiro-ehcache-1.2.3.jar)



2.配置cacheManager

<!-- securityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 将realm注入到当前的securityManager中 -->
<property name="realm" ref="customRealm"></property>
<!-- 注入缓存管理器 -->
<property name="cacheManager" ref="cacheManager"></property>
</bean>
<!-- 缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="claspath:shiro-ehcache.xml"></property>
</bean>



3.配置shiro-ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!--diskStore:缓存数据持久化的目录 地址 -->
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>




4.缓存清空

如果用户正常退出,缓存自动清空。
如果用户非正常退出,缓存自动清空。


如果修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。

需要手动进行编程实现:
在权限修改后调用realm的clearCache方法清除缓存。
下边的代码正常开发时要放在service中调用。
在service中,权限修改后调用realm的方法。
在realm中定义clearCached方法:


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


测试清除缓存controller方法:

@Controller
public class ClearShiroCache {

//注入realm
@Autowired
private CustomRealm customRealm;

@RequestMapping("/clearShiroCache")
public String clearShiroCache(){
//清除缓存,将来正常开发要在service调用customRealm.clearCached()
customRealm.clearCached();
return "success";
}
}



手动清除缓存

在浏览器的地址栏访问-->/clearShiroCache.action 就可以清除缓存了












标签:clearCached,缓存,realm,调用,授权,shiro
From: https://blog.51cto.com/u_12182769/6043808

相关文章

  • shiro 记住我 的实现
    记住我用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆。1.用户身份实现java.io.Serializable接口向cookie记录身份......
  • shiro-从数据库中获取授权信息与显示菜单在页面上(注解版和jsp标签)
    修改realm的doGetAuthorizationInfo,从数据库查询权限信息。使用注解式授权方法。使用jsp标签授权方法。1.修改doGetAuthorizationInfo从数据库查询......
  • shiro-realm授权过虑器
    使用PermissionsAuthorizationFilter在applicationContext-shiro.xml中配置url所对应的权限测试流程:1、在applicationContext-shiro.xml中配置filter规则<!--商品查询需要......
  • Redis(十四)——缓存问题
     1、缓存穿透(1)问题描述缓存和数据库中都没有数据。例如利用不存在的key恶意攻击,导致数据库压力过大(2)解决方案接口层增加参数校验,用户鉴权,id非法拦截。从缓存取......
  • 自命为缓存之王的Caffeine(1)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~  SpringBoot在2.0之前,可以使用Google Guava和Ehcache实现进程内缓存功能。GoogleGuava是基于LRU机制实现的进程内......
  • 自命为缓存之王的Caffeine(1)
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~SpringBoot在2.0之前,可以使用Google Guava和Ehcache实现进程内缓存功能。GoogleGuava是基于LRU机制实现的进程内缓存,而E......
  • 聊一聊安全且正确使用缓存的那些事 —— 关于缓存可靠性、关乎数据一致性
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。在......
  • “堆外缓存”这玩意是真不错,我要写进简历了。
    你好呀,我是歪歪。之前在《3招将吞吐量提升了100%,现在它是我的了》这篇文章中,我在OHC堆外缓存上插了个眼:这次就把这个眼给回收了吧,给你盘一下OHC。之前的文章里面......
  • 【工具】PrimoCache和Qiling:快速缓存优化加速软件
            才发现原来还有这种软件!这两个软件通过快速缓存可以提高整体系统性能。系统或其他应用程序频繁访问的临时文件,以及读取RAM内存的速度远远大于真实硬盘,因此......
  • 如何保证数据库与缓存中数据的一致性?
    首先,我觉得只要用到了缓存,是没有办法达到强一致性的,尤其是在高并发场景下面。当我们对数据进行修改的时候,到底是先删缓存,还是先写数据库?1、如果先删缓存,再写数据库:在高......