背景:

上文中在落地实践时,对Shiro进行了相关的配置,并未对其含义作用进行详细学习,本章将进一步详解其作用含义。

Shiro配置类中的各个配置项的作用:

@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myRealm());
securityManager.setSessionManager(defaultWebSessionManager());
securityManager.setCacheManager(ehCacheManager());
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
  • securityManager() 方法创建一个 DefaultWebSecurityManager 对象,并设置了相关的组件。DefaultWebSecurityManager 是 Shiro 的 SecurityManager 实现类,用于管理所有的 Subject(用户)。
  • setRealm(myRealm()) 设置了自定义的 Realm 对象,用于处理认证和授权逻辑。
  • setSessionManager(defaultWebSessionManager()) 设置了默认的 SessionManager 对象,用于管理用户的会话信息。
  • setCacheManager(ehCacheManager()) 设置了 EhCache 缓存管理器,用于缓存用户信息和权限信息。
  • setRememberMeManager(rememberMeManager()) 设置了 RememberMeManager,用于实现 "记住我" 功能。
public class MyShiroRealm extends AuthorizingRealm {
@Resource
private UserInfoService userInfoService; @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
UserInfo userInfo = (UserInfo) principalCollection.getPrimaryPrincipal();
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
for (SysRole role : userInfo.getRoles()) {
simpleAuthorizationInfo.addRole(role.getName());
for (SysPermission permission : role.getPermissions()) {
simpleAuthorizationInfo.addStringPermission(permission.getName());
}
}
return simpleAuthorizationInfo;
} @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 获取用户名
String username = (String) authenticationToken.getPrincipal();
// 根据username从数据库中查找 UserInfo 对象
UserInfo userInfo = userInfoService.findByUsername(username);
if (null == userInfo) {
return null;
} SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
userInfo, // 用户名
userInfo.getPassword(), // 密码
ByteSource.Util.bytes(userInfo.getSalt()), // salt=username+salt
getName() // realm name
);
return simpleAuthenticationInfo;
}
}
MyShiroRealm 是一个自定义的 Realm 对象继承 AuthorizingRealm ,并实现其两个方法,在这两个方法中进行认证和授权相关逻辑的编写。以便 login 执行的调用。

@Bean
public DefaultWebSessionManager defaultWebSessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setGlobalSessionTimeout(1800000);
sessionManager.setSessionIdCookie(sessionIdCookie());
return sessionManager;
}
  • defaultWebSessionManager() 方法创建一个 DefaultWebSessionManager 对象,用于管理用户的会话信息。
  • setGlobalSessionTimeout(1800000) 设置全局会话超时时间为30分钟。
  • setSessionIdCookie(sessionIdCookie()) 设置会话 ID 的 Cookie。
@Bean
public SimpleCookie sessionIdCookie() {
SimpleCookie cookie = new SimpleCookie("sid");
cookie.setHttpOnly(true);
cookie.setMaxAge(-1);
return cookie;
}
  • sessionIdCookie() 方法创建一个 SimpleCookie 对象,用于设置会话 ID 的 Cookie。
  • setHttpOnly(true) 表示该 Cookie 只能通过 HTTP 协议获取,不能通过 JavaScript 等脚本语言获取,有助于防止跨站脚本攻击(XSS)。
  • setMaxAge(-1) 表示该 Cookie 的有效期为浏览器会话结束时失效,即关闭浏览器后会话结束。
@Bean
public EhCacheManager ehCacheManager() {
EhCacheManager cacheManager = new EhCacheManager();
cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
return cacheManager;
}
  • ehCacheManager() 方法创建一个 EhCacheManager 对象,用于缓存 Shiro 的数据。
  • setCacheManagerConfigFile("classpath:ehcache.xml") 指定 EhCache 的配置文件位置。
@Bean
public RememberMeManager rememberMeManager() {
CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
rememberMeManager.setCookie(rememberMeCookie());
rememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
return rememberMeManager;
}
  • rememberMeManager() 方法创建一个 RememberMeManager 对象,用于实现 "记住我" 功能。
  • setCookie(rememberMeCookie()) 设置 RememberMe 的 Cookie。
  • setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag==")) 设置加密密钥,用于加密 "记住我" 的信息。
@Bean
public SimpleCookie rememberMeCookie() {
SimpleCookie cookie = new SimpleCookie("rememberMe");
cookie.setHttpOnly(true);
cookie.setMaxAge(2592000); // 30 days
return cookie;
}
  • rememberMeCookie() 方法创建一个 SimpleCookie 对象,用于设置 RememberMe 的 Cookie。
  • setMaxAge(2592000) 设置 RememberMe 的 Cookie 有效期为 30 天。

小结:

  通过对 Shiro 配置类中各个配置项的详细解释,可以更好地理解每个配置项的作用和含义,以及为什么要进行这些配置。这些配置项的设置可以根据具体的需求进行调整,以满足应用程序的安全性和功能性要求

Shiro配置类中的各个配置项浅谈的更多相关文章

  1. SpringBoot整合Shiro 二:Shiro配置类

    环境搭建见上篇:SpringBoot整合Shiro 一:搭建环境 Shiro配置类配置 shiro的配置主要集中在 ShiroFilterFactoryBean 中 关于权限: anon:无需认证就可 ...

  2. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  3. 对kotlin和java中的synchronized的浅谈

    synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...

  4. C++ STL中的常用容器浅谈

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...

  5. Java中Integer和String浅谈

    Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...

  6. Java中常用修饰符浅谈

    一.public.protected.default和private修饰符的作用域 public:在java程序中,如果将属性和方法定义为 public 类型,那么此属性和方法所在的类和及其子类,同一 ...

  7. CSS属性中的display属性浅谈;

    首先我们要知道什么是块级元素和行内元素有什么区别: 承接上篇文章:(浅谈HTML和body标签) 块级元素:浏览器解析为独占一行的元素(例如:div.table.ul等.),浏览器会在该元素的前后显示 ...

  8. ASP.NET中Session的个人浅谈

    看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意 ...

  9. Java中的容器 I————浅谈Queue和PriorityQueue

    一.Queue的实现 通过LinkedList类实现Queue接口来完成对Queue的实例类的实现,代码如下: Queue<Integer> queue=new LinkedList< ...

  10. Java中的容器 I————浅谈List

    一.List接口的继承关系 List接口是Collection接口的子接口,而ArrayList和LinkedList以及Vector是其实现类. List的特点是可以将元素维护在特定的序列中,可以再 ...

随机推荐

  1. Python-3.10手动配置环境变量

  2. c#构建具有用户认证与管理的socks5代理服务端

    Socks 协议是一种代理 (Proxy) 协议, 例如我们所熟知的 Shdowsocks 便是 Socks 协议的一个典型应用程序, Socks 协议有多个版本, 目前最新的版本为 5, 其协议标准 ...

  3. Isito 入门:为什么学 Istio、Istio 是什么

    1,Istio 概述 聊聊微服务设计 似乎用上 Kubernetes ,就是微服务系统了. 碰到很多人或公司盲目崇拜 Kubernetes ,一直喊着要上 Kubernetes,但是本身既没有技术储备 ...

  4. spring cloud gateway网关(一)之网关路由

    1.gateway相关介绍 在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房.不同地区.不同域名下.这种情况下,客户端(例如浏览器.手机.软件工具等)想要直接请求这些服务,就需要 ...

  5. Java基础之基础语法与面向对象

    前言 小知识 Java由Sun公司于1995年推出,2009年Sun公司被Oracle公司收购,取得Java的版权 Java之父:James Gosling(詹姆斯·高斯林) 专业术语 JDK:jav ...

  6. 天下苦 Spring 久矣,Solon v2.3.3 发布

    Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...

  7. 容器基础-- namespace,Cgoup 和 UnionFS

    Namespace 什么是 Namespace ? 这里的 "namespace" 指的是 Linux namespace 技术,它是 Linux 内核实现的一种隔离方案.简而言之 ...

  8. 春秋杯春季联赛&&ciscn2023华北赛区部分题解

    前言 复现几个比赛时没做出来的题 1.[CISCN 2023 华北赛区]ez_ruby 查文档可知 ruby内置的open函数,如果第一个字符是管道符|,后面就可以接命令.这可能是考察涉猎的知识范围广 ...

  9. GO 语言中 slice 的理解

    GO 语言中 slice 理解 为什么说 Go 语言的 slice 是引用类型,其底层实现明明是一个结构体? slice 的底层实现是一个包含三个字段的结构体:指向底层数组的指针.slice 的长度和 ...

  10. mysql高级进阶(存储过程、游标、触发器)

    废话不多说,直接进入正题... 一.存储过程 a.概述 存储过程可以看成是对一系列 SQL 操作的批处理: 使用存储过程的好处 代码封装,保证了一定的安全性: 代码复用: 由于是预先编译,因此具有很高 ...