shiro实现本地内存Ehcache实现将菜单权限进行缓存

Posted 健康平安的活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro实现本地内存Ehcache实现将菜单权限进行缓存相关的知识,希望对你有一定的参考价值。

一 为何要使用缓存

我们在认证通过进行授权,执行页面的hasRoles(xxx) ,isPermited(xxx) 这些语句时,会调用底层中自定义reaml中的doGetAutorizationInfo(xxxxxx)方法

我们使用ljf账户模拟登陆:

index.jsp页面:

2.使用admin进行登录

index.jsp页面:

3.查看index.jsp页面

查看后端调用:和前端页面调用标签一一对应,ljf的角色为user,则调用7次,admin的角色为admin,则调用8次

 二.使用缓存

2.1 缓存的作用

  • Cache 缓存: 计算机内存中一段数据

  • 作用: 用来减轻DB的访问压力,从而提高系统的查询效率

2.2 缓存执行流程

2.3 配置流程

1.pom文件:

 <!--引入shiro和ehcache-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>1.5.3</version>
        </dependency>

2.在reaml中设置缓存代码

package com.shiro.ljf.demo.sptshirodemo.config;

import com.shiro.ljf.demo.sptshirodemo.shiro.CustomerRealm;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @ClassName: ShiroConfig
 * @Description: TODO   整合springboot的shiro配置类
 * @Author: liujianfu
 * @Date: 2020/10/28 15:11:16 
 * @Version: V1.0
 **/
@Configuration
public class ShiroConfig {
    //1.创建shiroFilter :负责拦截所有请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        System.out.println("step3:>>进入过滤器");
        //创建shiro的filter,配置shiroFilterFactoryBean
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //注入安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //设置过滤资源
        Map<String,String> map =  new LinkedHashMap<>();
        //map.put("/**","authc");
        /** 代表拦截项目中一切资源  authc 代表shiro中的一个filter的别名,详细内容看文档的shirofilter列表**/
        //map.put("/index.jsp","authc");//验证资源

      //  map.put("/index*","anon");//验证资源 anon  匿名访问,可以跳转到index要访问的controller
        //设置公共资源 ,anno过滤器,设置访问公共资源,放在前面
        map.put("/user/login","anon");
        map.put("/user/register","anon");//anon 设置为公共资源  放行资源放在前面
        map.put("/register.jsp","anon");//anon 设置为公共资源  放行资源放在前面
        //设置受限资源

        map.put("/index*","authc");//验证资源,受限资源,跳转登录login.jsp页面
        //默认认证跳转路径
        shiroFilterFactoryBean.setLoginUrl("/login.jsp");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }
    //2.创建安全管理器
    @Bean(name="securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") Realm realm){
        System.out.println("step2:>> 进入securityManager方法");
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //给安全管理器设置
        defaultWebSecurityManager.setRealm(realm);

        return defaultWebSecurityManager;
    }
    //3.创建自定义realm
    @Bean(name="userRealm")
    public Realm getRealm(){
        System.out.println("step1:>>进入realm方法");
        //return new CustomerRealm();
        CustomerRealm customerRealm = new CustomerRealm();

        //修改凭证校验匹配器
        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
        //设置加密算法为md5
        credentialsMatcher.setHashAlgorithmName("MD5");
        //设置散列次数
        credentialsMatcher.setHashIterations(1024);
        customerRealm.setCredentialsMatcher(credentialsMatcher);

        /**
        //开启缓存管理 **/
        customerRealm.setCacheManager(new EhCacheManager());
        customerRealm.setCachingEnabled(true);//开启全局缓存
        customerRealm.setAuthenticationCachingEnabled(true);//认证认证缓存
        customerRealm.setAuthenticationCacheName("my-authenticationCache");
        customerRealm.setAuthorizationCachingEnabled(true);//开启授权缓存
        customerRealm.setAuthorizationCacheName("my-authorizationCache");


        return customerRealm;
    }
}

2.4 调试

1.使用ljf账号,输入:http://localhost:8888/shiro/index  登录成功后,使劲刷新页面

可以看到后端只加载了一次授权方法

2.使用admin账号,输入:http://localhost:8888/shiro/index  登录成功后,使劲刷新页面 

使劲刷新页面,后端提示,只加载了一次授权方法:

 结论:是使用缓存Ehacache,实现了缓存开启功能!

以上是关于shiro实现本地内存Ehcache实现将菜单权限进行缓存的主要内容,如果未能解决你的问题,请参考以下文章

Shiro整合Springboot缓存之EhCache实现

SSM+Apache shiro--ehcache缓存清理

从零到实现Shiro中Authorization和Authentication的缓存

shiro使用redis实现将菜单权限进行缓存

ehcache java 对象缓存怎么实现

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送