shiro的简单介绍

article/2025/10/7 16:05:58

1.Shiro的简单配置

1) 获取ShiroFilterFactoryBean,作用是在执行相关操作前,先进行功能过滤,拦截所有请求,进入到shiro中进行认证与授权
例如:设置一些拦截的请求
// 身份认证失败,则跳转到登录页面的配置
bean.setLoginUrl(“/tologin”);
// 权限认证失败,则跳转到指定页面
bean.setUnauthorizedUrl(“/tologin”);

2) 创建SecurityManager,来管理shiro;Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。

3) Realm 充当了 Shiro 与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro 会从应用配置的 Realm 中查找用户及其权限信息,可见Realm的重要。
当配置 Shiro时,你必须至少指定一个 Realm ,用于认证和(或)授权。配置多个 Realm 是可以的,但是至少需要一个。

Shiro默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm,以userRealm为例子。

shiroConfig配置:

package com.example.demo.config;import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
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;@Configuration
public class ShiroConfig {//ShiroFilterFactoryBean@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();//设置安全管理器bean.setSecurityManager(defaultWebSecurityManager);/* // 身份认证失败,则跳转到登录页面的配置bean.setLoginUrl("/tologin");// 权限认证失败,则跳转到指定页面bean.setUnauthorizedUrl("/tologin");*///添加shiro的内置过滤器/*** anno 无需认证就可以访问必须认证了才能访问*authc* user:必须拥有记住我功能才适用* perms :拥有对某个资源的权限才能访问* role:拥有某个角色的权限*///拦截请求
//        Map<String,String> filterChainDefinitionMap =new LinkedHashMap<>();//        filterChainDefinitionMap.put("/tologin","authc");//免登录验证//        filterChainDefinitionMap.put("/user/update","anon");//免登录验证
//        filterChainDefinitionMap.put("/user/**","authc");//支持通配符操作  authc
//        filterChainDefinitionMap.put("/user/add","authc");//身份验证//方式一:anon,authcMap<String,String> filterChainDefinitionMap =new LinkedHashMap<>();filterChainDefinitionMap.put("/user/add","anon");filterChainDefinitionMap.put("/user/update","authc");
//        filterChainDefinitionMap.put("/**","authc");//支持通配符操作  authcbean.setFilterChainDefinitionMap(filterChainDefinitionMap);/*//方式二:permsMap<String,String> filterMap =new LinkedHashMap<>();filterMap.put("/user/add","perms[user:add]");filterMap.put("/user/update","perms[user:update]");bean.setFilterChainDefinitionMap(filterMap);*///方式三:roles  加上roleFilter 类,并在UserRealm增加info.addRole("user");/*Map<String,String> filterMap =new LinkedHashMap<>();filterMap.put("/user/add","roles[user]");filterMap.put("/user/update","roles[leader]");bean.setFilterChainDefinitionMap(filterMap);*/bean.setLoginUrl("/tologin");//设置未授权的请求bean.setUnauthorizedUrl("/noauth");return bean;}//方式二:user/*登录接口加上  token.setRememberMe(true);<shiro:user>当有记住我信息,或已登录,则显示标签体内容</shiro:user>*///DefaultWebSecurityManager2@Beanpublic DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){DefaultWebSecurityManager securityManager =new DefaultWebSecurityManager();//关联userRealmsecurityManager.setRealm(userRealm);return securityManager;}//创建realm对象,需要自定义类1@Beanpublic UserRealm userRealm(){return new UserRealm();}//整合shiroDialect:用来整合shiro thymeleaf@Beanpublic ShiroDialect getShiroDialect(){return new ShiroDialect();}
}

userRealm配置

package com.example.demo.config;import com.example.demo.pojo.User;
import com.example.demo.service.imp.UserServiceImpl;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;public class UserRealm extends AuthorizingRealm {@AutowiredUserServiceImpl userService;//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("执行了=>授权");SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();//        info.addRole("user");info.addStringPermission("user:update");info.addStringPermission("user:add");//拿到当前用户登陆对象Subject subject= SecurityUtils.getSubject();User currentUser= (User) subject.getPrincipal();//拿到User对象
//        info.addStringPermission(currentUser.getPerms());//设置当前用户对象return info;}//认证(用户的权限)@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("执行了=>认证");//        String name="陈汝旭";
//        String password="123456";//连接真实数据库UsernamePasswordToken userToken =(UsernamePasswordToken) authenticationToken;
//        if (!userToken.getUsername().equals(name)){
//            return null; //抛出异常 unkonwAccountexception登录失败
//        }
//        //密码认证
//        return new SimpleAuthenticationInfo("",password,"");User user=userService.queryUserByName(userToken.getUsername());//获取用户名String name=user.getName();String password=user.getPwd();if(user==null){//说明查无此人return null;}return new SimpleAuthenticationInfo(user,password,name);}}

问题:“当对用户执行认证(登录)和授权(访问控制)验证时,Shiro 会从应用配置的 Realm 中查找用户及其权限信息。”,怎么实现?

2.认证的代码流程

1)执行登录的方法
subject.login(token);//执行登陆的方法
2)研究一下login()的方法,进入源码
在这里插入图片描述

3)再进入实现类
(这个login方法大多都是赋值的操作,我们可以只抓住主要的语句分析)
在这里插入图片描述
4)进入这个方法Subject subject = this.securityManager.login(this, token);的实现类
在这里插入图片描述
5)
在这里插入图片描述
6)都是一些异常处理信息,主要研究info = this.doAuthenticate(token);
在这里插入图片描述
7)这里以单realm来研究 doSingleRealmAuthentication
()

在这里插入图片描述
8)再继续下钻到了这里,主要研究 realm.getAuthenticationInfo(token);可以发现getAuthenticationInfo原来是抽象接口Realm的其中一个方法
在这里插入图片描述
9)紧接着进入realm的其中一个实现类AuthenticatingRealm
(个人觉得研究源码可以不全看懂,尽量抓住主要的语句即可,因为获取缓存中的信息无法帮助我们研究流程,可以先不理会)

在这里插入图片描述

10)doGetAuthenticationInfo一直下钻进来,可以看到我们继承的子类的方法AuthenticationInfo,然后在自定义的AuthenticationInfo进行用户认证的操作。
在这里插入图片描述
在这里插入图片描述

3.授权的代码流程

shiro判断权限的方法有subject.isPermitted(“user”),subject.hasRole(“user”);等
以subject.isPermitted(“user”)作为研究

1)点进去它的实现类DelegatingSubject,先判断身份this.hasPrincipals(),在判断授权,所以主要研究isPermitted()
在这里插入图片描述
2)再继续点进去实现类AuthorizingRealm

在这里插入图片描述
3)主要研究getAuthorizationInfo()这个方法

在这里插入图片描述
4)根据上面说的经验,缓存的方法可以先不理会,这里大多也是一些异常处理信息,所以主要研究 info = this.doGetAuthorizationInfo(principals);

在这里插入图片描述
5)再点击进去,又到了我们的老朋友userRealm的doGetAuthorizationInfo
在这里插入图片描述

正常情况这里将从数据库中获取到相对应的权限信息
(为了偷懒,这里就采用写死的方式获取权限)

在这里插入图片描述

4.三种权限认证的方式

在这里插入图片描述


http://chatgpt.dhexx.cn/article/8taaLeng.shtml

相关文章

Shiro相关基础知识

文章目录 前言一、Shiro相关基础知识1.Shiro是什么2.Shiro具体功能3.Shiro的整体结构与重要组件4.Shiro各模块基础知识1&#xff09;Authentication 认证模块2&#xff09;Authorization 授权模块3&#xff09;Realm 认证模块 5.Shiro集成到web应用 二、Shiro相关漏洞1. Shiro漏…

面试总结:Shiro框架

文章目录 Apache Shiro框架1. 简单介绍一下Shiro 框架2. Shiro 主要的四个组件3. Shiro 运行原理4. Shiro 的四种权限控制方式5. 授权实现的流程&#xff08;1&#xff09;、什么是粗颗粒和细颗粒权限&#xff1f;&#xff08;2&#xff09;、粗颗粒和细颗粒如何授权&#xff1…

shiro安全框架详解。面试必备

shiro核心就是过滤器。 认证授权流程&#xff1a; ● 认证&#xff1a;对用户的身份进行检查&#xff08;登录验证&#xff09; ● 授权&#xff1a;对用户的权限进行检查&#xff08;是否有对应的操作权限&#xff09; ● 流程图&#xff1a; 权限管理 实现权限的动态分配&a…

面试专题系列-Shiro

1.什么是shiro Apache Shiro 是 Java 的一个安全框架。使用 shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在 JavaSE环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存等。 2.Sh…

shiro(详解)

这里写自定义目录标题 什么是shiro什么是权限管理什么是身份认证什么是授权SubjectSecurityManagerAuthenticatorAuthorizerRealmSessionManagerSessionDAOCacheManagerCryptography面试题认证的开发1. 创建项目并引入依赖2. 引入shiro配置文件并加入如下配置 自定义Realm自定义…

【JAVA面试题整理】框架之Shiro

一、简单介绍一下Shiro框架 Apache Shiro是java的一个安全框架。使用shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。 三…

shiro总结

shiro主要内容: 1:SecurityUtils shiro提供的工具类,主要作用是获取 SecurityManager和Subject public abstract class SecurityUtils {private static SecurityManager securityManager;//获取Subjectpublic static Subject getSubject() {Subject subject ThreadContext.…

Java面试系列总结 :Shiro

1. 简单介绍一下Shiro框架 Apache Shiro是Java的一个安全框架。使用shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。 三个…

Shiro知识总结二

3. 与 Spring Boot 整合 3.1 框架整合 依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>o…

Shiro相关知识

1、Shiro功能概述 Apache Shiro是一个功能强大且易于使用的 Java 安全框架&#xff0c;可执行身份验证、授权、加密和会话管理。 主要功能&#xff1a; Authentication&#xff1a;身份认证。登录时验证身份信息。 Authorization&#xff1a;授权操作。访问控制的过程&…

Spring、SpringMVC、Shiro面试题

Tags : JavaEE,Spring,面试题发表时间&#xff1a; 2014-11-29 15:03:53 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 比如&#xff1a; 转自&#xff1a;Su的技术博客 原文地址&#xff…

Shiro知识总结一

1. 基础知识 1.1 什么是Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应…

Shiro总结面试问题

Shiro总结 Shiro可做哪些事&#xff1a; 认证、授权、加密、会话管理、与web集成、缓存等 最简单的Shiro应用是怎样运行的&#xff1a; 应用代码通过Subject来进行认证和授权&#xff0c;而Subject又委托给SecurityManager 我们需要给Shiro的SecurityManager注入Realm,从而让S…

python中socket进行多线程,利用 Socket怎么在Python项目中实现一个多线程并发功能...

利用 Socket怎么在Python项目中实现一个多线程并发功能 发布时间:2020-12-11 13:55:06 来源:亿速云 阅读:95 作者:Leah 这篇文章给大家介绍利用 Socket怎么在Python项目中实现一个多线程并发功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 1.S…

Jmeter多线程并发和压测结果分析

一、多线程并发 1. 线程组简介: (1). 线程数: 配置虚拟用户数量 (2). Ramp-Up时间:设置的虚拟用户数需要多长时间全部启动,如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。 (3). 循环次数 (4). 调度器-持续时间(秒),压测多长时间…

面试必问!多线程并发问题

多线程并发问题&#xff0c;基本是面试必问的。 大部分同学应该都知道Synchronized&#xff0c;Lock&#xff0c;部分同学能说到volatile、并发包&#xff0c;优秀的同学则能在前面的基础上&#xff0c;说出Synchronized、volatile的原理&#xff0c;以及并发包中常用的数据结…

实际场景中的多线程并发编程案例

目录 使用多线程的意义&#xff1a; CountDownLatch 案例一&#xff1a;多线程同步发起并发请求 案例二&#xff1a;rocketmq内&#xff0c;每个broker将自己注册到所有的nameserver时 案例三&#xff1a;利用异步线程实现同步请求 CompletableFuture 应用一&#xff1a…

【已解决】利用 Java 多线程并发编程提高数据处理效率

&#x1f389;工作场景中遇到这样一个需求&#xff1a;根据主机的 IP 地址联动更新其他模型的相关信息。需求很简单&#xff0c;只涉及一般的数据库联动查询以及更新操作&#xff0c;然而在编码实现过程中发现&#xff0c;由于主机的数量很多&#xff0c;导致循环遍历查询、更新…

c++ 多线程并发

基于C11的线程池(threadpool),简洁且可以带任意多的参数 - _Ong - 博客园 C11多线程编程(六)——线程池的实现 1. ① thread #include <iostream> #include <thread>class A { public:void operator()() {std::cout << "11111\n";} };int main…

python多线程并发请求

再api测试时&#xff0c;避免不了高并发的测试情况。所以以下案例为线程并发请求代码&#xff0c;以请求百度为例 #!/usr/bin/env python #!coding:utf-8 from __future__ import division from threading import Thread import requests import matplotlib.pyplot as plt imp…