Shiro权限框架-Realm缓存机制(6)

2023-11-04

1、Realm缓存机制意义

在上面我们自定了自己的realm,但是我们发现

在认证和授权的时候,程序需要频繁的访问数据库,这样对于数据库的压力可想而知,那我们怎么处理呢?

2、Realm缓存机制实现思路

【1】缓存机制图解

【2】原理分析

此时我们对UserBridgeServiceImpl的实现类里面的逻辑加入了自定义的SimpleCacheService缓存服务接口,简单来说实现了在认证和鉴权时不需要每次都去查询数据库,而是把认证和鉴权信息放入到redis缓存中,以减低数据库的访问压力

1、集成redis服务器,作为集中存储认证和鉴权信息
2、改写UserBridgeServiceImpl使其优先从缓存中读取

3、redission集成

【1】添加ShiroRedisProperties

此类主要负责yaml文件的配置类

package com.newbies.shiro.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.io.Serializable;

/**
 * @Description  redis配置文件
 */
@Data
@ConfigurationProperties(prefix = "itheima.framework.shiro.redis")
public class ShiroRedisProperties implements Serializable {

	/**
	 * redis连接地址
	 */
	private String nodes ;

	/**
	 * 获取连接超时时间
	 */
	private int connectTimeout ;

	/**
	 * 连接池大小
	 */
	private int connectPoolSize;

	/**
	 * 初始化连接数
	 */
	private int connectionMinimumidleSize ;

	/**
	 * 等待数据返回超时时间
	 */
	private int timeout ;

	/**
	 *  全局超时时间
	 */
	private long globalSessionTimeout;

}

【2】编辑ShiroConfig

集成redisson的相关配置,同时启用ShiroRedisProperties的配置

package com.newbies.shiro.config;


import com.newbies.shiro.core.ShiroDbRealm;
import com.newbies.shiro.core.impl.ShiroDbRealmImpl;
import com.newbies.shiro.filter.RolesOrAuthorizationFilter;
import com.newbies.shiro.properties.PropertiesUtil;
import lombok.extern.log4j.Log4j2;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description 权限配置类
 */
@Configuration
@ComponentScan(basePackages = "com.itheima.shiro.core")
@EnableConfigurationProperties({ShiroRedisProperties.class})
@Log4j2
public class ShiroConfig {

    @Autowired
    private ShiroRedisProperties shiroRedisProperties;

    /**
     * @Description redission客户端
     */
    @Bean("redissonClientForShiro")
    public RedissonClient redissonClient() {
        log.info("=====初始化redissonClientForShiro开始======");
        String[] nodeList = shiroRedisProperties.getNodes().split(",");
        Config config = new Config();
        if (nodeList.length == 1) {
            config.useSingleServer().setAddress(nodeList[0])
                    .setConnectTimeout(shiroRedisProperties.getConnectTimeout())
                    .setConnectionMinimumIdleSize(shiroRedisProperties.getConnectionMinimumidleSize())
                    .setConnectionPoolSize(shiroRedisProperties.getConnectPoolSize()).setTimeout(shiroRedisProperties.getTimeout());
        } else {
            config.useClusterServers().addNodeAddress(nodeList)
                    .setConnectTimeout(shiroRedisProperties.getConnectTimeout())
                    .setMasterConnectionMinimumIdleSize(shiroRedisProperties.getConnectionMinimumidleSize())
                    .setMasterConnectionPoolSize(shiroRedisProperties.getConnectPoolSize()).setTimeout(shiroRedisProperties.getTimeout());
        }
        RedissonClient redissonClient =  Redisson.create(config);
        log.info("=====初始化redissonClientForShiro完成======");
        return redissonClient;
    }

    /**
     * @Description 创建cookie对象
     */
    @Bean(name="sessionIdCookie")
    public SimpleCookie simpleCookie(){
        SimpleCookie simpleCookie = new SimpleCookie();
        simpleCookie.setName("ShiroSession");
        return simpleCookie;
    }

    /**
     * @Description 权限管理器
     * @param
     * @return
     */
    @Bean(name="securityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(shiro
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiro权限框架-Realm缓存机制(6) 的相关文章

  • SpringBoot 整合shiro框架

    网上有很多整合shiro的博客分享 但是貌似没找到一个完整 并且能够实现的 不是包的问题 就是代码的问题 也可能是自己的问题 或者版本的问题 所以 整理了一版自己已应用的 maven依赖
  • Shiro使用redis作为缓存(解决shiro频繁访问Redis)(十一)

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 80791219 王赛超 之前写过一篇博客 使用的一个开源项目 实现了redis作为缓存 缓存用户的权限 和 sess
  • shiro入门详解以及使用方法、shiro认证与shiro授权

    shiro介绍 什么是shiro shiro是Apache的一个开源框架 它将软件系统的安全认证相关的功能抽取出来 实现用户身份认证 权限授权 加密 会话管理等功能 组成了一个通用的安全认证框架 它可以实现如下的功能 1 验证用户 2 对用
  • springboot2+shiro+redis限制同一账号同时在线人数

    springboot2 shiro redis限制同一账号同时在线人数 我们在写系统的时候 需要注意账号安全问题 最好的处理方法就是同一个账号只能在一个地方登录 原理 大概的原理就是每次登录的时候将登录的sessionId存入缓存 然后登录
  • shiro配置文件shiro.ini简介说明

    转自 shiro配置文件shiro ini简介说明 下文笔者讲述shiro配置文件shiro ini的简介说明 如下所示 shiro ini 是一个shiro的配置文件 它通常放在classpath路径下 shiro ini配置文件包含以下
  • springboot整合shiro(新手教程)

    咱们也就不多哔哔 直接开始 我先放我自己写的项目结构 第一步 想啥了 肯定是先创建一个springboot的项目 第二步 配置pom文件
  • shiro基础

    shiro基础 shiro中有三大核心架构 subjects security manager realms 分别代表 使用shiro的主体 核心安全管理器和数据和安全管理的连接 使用shiro首先需要引入shiro需要的依赖 可以通过ma
  • SpringBoot 整合 Shiro 常见配置

    目录 一 Shiro 基础解释 过滤器 AOP 实现安全认证权限管理逻辑 了解 Shiro 的组织架构 二 SpringBoot 整合 Shiro 1 在项目中使用 Shiro 需要配置的地方 2 代码示例 引入依赖 请求接口 自定义 Re
  • Shiro权限框架-Springboot集成Shiro(5)

    1 技术栈 主框架 springboot 响应层 springMVC 持久层 mybatis 事务控制 jta 前端技术 easyui 2 数据库设计 1 数据库图解 sh user 用户表 一个用户可以有多个角色 sh role 角色表
  • springboot整合shiro-登录失败次数限制(八)

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 80461177 王赛超 这次讲讲如何限制用户登录尝试次数 防止坏人多次尝试 恶意暴力破解密码的情况出现 要限制用户登
  • Springboot2(23)轻松整合shiro(带验证码)

    源码地址 springboot2教程系列 Shiro配置 1 Spring集成Shiro一般通过xml配置 SpringBoot集成Shiro一般通过java代码配合 Configuration和 Bean配置 2 Shiro的核心通过过滤
  • shiro使用自定义realm实现数据认证

    自定义realm实现数据认证 在开发中 有时会与一些nosql或者其他地方保存的数据进行认证 这时候 shiro定义的那些realm类可能不能满足实际的功能需求 这时候我们可以通过自定义一个realm来沟通这些数据 实现认证和权限控制 首先
  • Shiro权限框架-实现分布式会话SessionManager(7)

    1 会话的问题 2 分布式会话实现思路 1 原理分析 所有服务器的session信息都存储到了同一个Redis集群中 即所有的服务都将 Session 的信息存储到 Redis 集群中 无论是对 Session 的注销 更新都会同步到集群中
  • Shiro错误之No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util

    提示 No SecurityManager accessible to the calling code either bound to the org apache shiro util ThreadContext or as a vm
  • Spring Boot的shiro整合(中)

    一 配置 1 MyShiroRealm类 package com wzq shiro config import javax annotation Resource import org apache shiro authc Authent
  • Apache Shiro JdbcRealm 与 JavaConfig 和 Spring Boot

    我正在尝试配置我的 Spring Boot 应用程序以使用 Apache Shiro 作为其安全框架 我已经完成了与 PropertiesRealm 一起使用的所有操作 现在我正在尝试使其与 JdbcRealm 和 Spring Boot
  • 带有 jdbc 和哈希密码的 shiro

    这是我的 shiro 配置 main authc loginUrl site index jsp authc usernameParam user authc passwordParam pass authc rememberMeParam
  • 使用 Shiro 登录后重定向到最后访问的页面

    使用 apache shiro 登录并重定向到最后访问的页面的更好方法是什么 我只有这个 SecurityUtils getSubject login new UsernamePasswordToken username password
  • 使用 ini 文件进行 Spring MVC 和 Shiro 配置

    我正在尝试使用 Spring MVC 和 Apache Shiro 建立一个环境 我正在关注 shiro apache org 中提到的文章 我在 web xml 中使用 Spring 的 DelegatingFilterProxy 作为
  • Shiro 使用 sessionId 或用户名+密码进行身份验证

    我在 Java 身份验证框架和身份验证工作流程方面没有太多经验 只有一些理论知识 因此出于教育目的 我尝试为我的 HTTP 应用程序创建这种类型的身份验证 客户端将登录名 密码发布到 login Shiro 通过给定的凭据登录用户 服务器返

随机推荐

  • 用mapreduce来操作hbase的两点优化

    用mapreduce来操作hbase的两点优化 用MR来对hbase的表数据进行分布式计算 有两点配置可以优化操作 提升性能 它们分别是 1 scan setCacheBlocks false 然后调用下面这句来初始化map任务 Table
  • 《数据挖掘基础》习题一

    7 数据 data 信息 information 和知识 knowledge 是人们认识和利用数据的三个不同阶段 数据挖掘技术是如何把它们有机的结合在一起的 数据是形成知识的源泉 不断的利用知识来获得信息 具体表现如下 客观世界 收集 数据
  • C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a functio...

    今天遇到一个Access Violation的crash 只看crash call stack没有找到更多的线索 于是在debug模式下又跑了一遍 遇到了如下的一个debug的错误提示框 这个是什么原因呢 我们来看一个简单的例子来重现这个错
  • 4.Nginx缓存设置和CDN

    文章目录 Nginx缓存设置 设置缓存 取消不需要内容的缓存 查看nginx缓存数据 CDN 概念 工作原理 Nginx缓存设置 设置缓存 在yum配置文件中添加nginx在线源 vim etc yum repos d nginx repo
  • python的日志记录(自带logging模块和优雅的Loguru第三方模块)

    logging模块简介 logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统 logging模块是Python的一个标准库模块 由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录
  • tensorflow(10)--自制数据集

    前面讲了怎么用tensorflow识别一些常用的数据集 但是吧 大部分时候 我们都需要识别自己的数据集 比如你有一万张猫狗图片 这时候就需要把本地的那些照片作为数据集传到网络结构中进行处理 这些自己的图片 叫做自制数据集 这篇文章 咱们用本
  • 【操作系统基础】临界区问题 和 和原子操作的理解 和 互斥锁的实现和理解

    文章目录 临界区问题 进程进入临界区协议 临界区的管理准则 喂金鱼案例理解临界区问题 互斥锁 原子操作 原子操作 test and set 的实现 lock 锁的实现 忙式等待 临界区问题 每个并发的进程都有一个代码段 被叫做临界区 这个代
  • 模块化import导入 报错Uncaught SyntaxError: Cannot use import statement outside a module

    我们在给js模块化导入的时候 有时候会报错 Uncaught SyntaxError Cannot use import statement outside a module 错误信息 错误分析 HTML 网页中 浏览器通过 script
  • js生成json数组

    var datas var data data id 1 data name test 1 data age 1 2 datas push data var jsonString JSON stringify datas id 1 name
  • csdn如何设置目录

    如何生成如下图片效果 如下教程所示
  • 一个页面多触发事件需要共用一个接口处理数据,封装回调函数方法回调处理数据

    事件共用方法 queryData code data callback let params code code 根据实际情况传入参数 data data 根据实际情况传入参数 传入借口参数 this axios url 接口url地址
  • 嘉立创PCB板免费打样

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 打样前准备 二 打样步骤 三 优惠券领取 总结 前言 提示 这里可以添加本文要记录的大概内容 友友们 你们肯定也和我有同样的经历 学会了使用嘉立创 或Al
  • 如何进行组件的封装,核心的思想是什么

    1 抽象组件通用逻辑 在开发组件时 我们需要考虑到未来的可维护性和复用性 这时就需要抽象出通用的逻辑或者功能 以便在不同的项目中使用 举个例子 我们可以编写一个图片轮播组件并抽象出自动轮播和手动轮播两种方式 以便在以后的项目中直接引用该组件
  • 第三届长安杯电子取证大赛总结---检材一

    感受 长安杯倾向于考察服务器的取证和网站的重构 第二次参加长安杯 相比第一次的懵逼这一次已经能出很多题目了 取证还是得多刷题 多总结归纳方法 赛事背景 2021年4月25日 上午8点左右 警方接到被害人金某报案 声称自己被敲诈数万元 经询问
  • 服务器尚未完成维护梦幻西游,5月31日维护:可使用点卡直接兑换精力!

    核心提示 2016儿童节活动 2016年5月31日12 00至6月5日12 00 亲爱的玩家朋友 为保证服务器的运行稳定和服务质量 梦幻西游 所有服务器将于2016年5月31日上午8 00停机 进行每周例行的维护工作 预计维护时间为上午8
  • 如何避开DLL load failed,安装pywin32

    啥 成功安装pywin32还是会报DLL load failed 点解啊 我是这样子解决的 这也不知道适不适用除了我之外的帅哥靓女 总之 遇到这问题就放手试试吧 反正你也没有别的办法 1 conda env list 2 conda act
  • [office]修改office2019安装位置,自定义安装需要的功能

    更新 2019 8 24 解决出现 The product can t be install ont the selection update channel 无法安装的问题 2019 5 30 楼主本人本次重装系统后装office2019
  • Loadrunner通过验证码并实现成功登录的方法

    需要安装的软件 1 安装ImageMagick安装完成后 将其安装路径添加到环境变量path中 2 安装Tesseract OCR define MAX NAME LEN 4 定义验证码字符串的长度 这里是4位 int flen 定义一个整
  • 华为OD机试 - 翻牌求最大分(Java)

    题目描述 给出n个牌数 在 100到100之间 求最大得分 规则如下 连续翻牌 如果选当前牌 则总得分等于上一次翻牌总得分加上当前牌的数字 如果当前总得分小于它前三次的总得分的话 那此次不翻牌 并且总得分就等于它前三次的得分 1到3次翻牌数
  • Shiro权限框架-Realm缓存机制(6)

    1 Realm缓存机制意义 在上面我们自定了自己的realm 但是我们发现 在认证和授权的时候 程序需要频繁的访问数据库 这样对于数据库的压力可想而知 那我们怎么处理呢 2 Realm缓存机制实现思路 1 缓存机制图解 2 原理分析 此时我