Shiro学习认证和授权

news2024/11/24 8:42:24

Shiro学习笔记

认证

思路

  1. 获取当前的Subject,调用SecurityUtils.getSubject()方法;
  2. 判断当前用户是否被认证,即是否已经登陆,调用Subject的isAuthenticated()方法进行判断;
  3. 若没有认证,则把用户名和密码封装成UsernamePasswordToken对象;
    • 创建表单页面
    • 把请求提交到SpringMVC的Handler;
    • 获取用户名和密码
  4. 执行登陆:调用Subject的login()方法;
  5. 继承AuthorizingRealm类,重写认证doGetAuthenticationInfo方法
    1. 从UsernamePasswordToken中取出前端传入的用户名和密码;
    2. 将从数据中查出的用户名和密码信息封装成AuthenticationInfo对象返回(一般为Simple)
  6. 由shiro中的credentialsMatcher自动完成密码的比对;
/**  
 * 认证方法  
 * @param authenticationToken  
 * @return  
 * @throws AuthenticationException  
 */  
@Override  
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {  
    UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;  
    String username = token.getUsername();  
  
    //根据用户名从数据库查询出用户名和密码  
  
    //如果用户不存在,则给出提示  
  
    //如果用户存在,根据用户的信息, 来构建 AuthenticationInfo 对象并返回. 通常使用的实现类为: SimpleAuthenticationInfo  
    //认证的实体信息. 可以是 username, 也可以是数据表对应的用户的实体类对象.  
    Object principal = username;  
    //密码  
    Object credentials = null;  
  
    //realName:当前realm的name,调用父类的getName()获取  
    String realmName = getName();  
  
    //shiro会把返回的SimpleAuthenticationInfo对象和UsernamePasswordToken中的对象进行比对  
    SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);  
    return info;  
}

多Realm认证

配置

1、配置ModularRealmAuthenticator对象;并设置认证策略;
2、SecurityManager中有authenticator属性,将ModularRealmAuthenticator对象设置进去;
3、SecurityManager中有realms属性,将多个realm传进去即可;

1. 配置 SecurityManager!-->  
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
    <property name="authenticator" ref="authenticator"></property>  
  
    <property name="realms">  
        <list>  
            <ref bean="jdbcRealm"/>  
            <ref bean="secondRealm"/>  
        </list>  
    </property>  
  
	 <property name="rememberMeManager.cookie.maxAge" value="10"></property> 
</bean>


<bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">  
	<!--指定认证策略-->
    <property name="authenticationStrategy">  
        <bean class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"></bean>  
    </property>  
</bean>

认证策略

认证执行流程分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

授权

授权思路

1、继承AuthorizingRealm类,重写doGetAuthorizationInfo方法,在其中实现授权的逻辑;
2、在controller中的方法上使用@RequiresPermissions注解表明需要的权限;

  1. 在controller上使用注解;
  2. 在代码中通过hasRole()、hasPermitted()等方法进行判断,
    3、请求controller中的方法时,如果方法上有权限注解,则会走重写doGetAuthorizationInfo方法发的授权逻辑,判断用户是否具有权限

ShiroFilter中可以通过下面的方式:配置哪些页面需要受保护. ,以及访问这些页面需要的权限。

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
    <property name="securityManager" ref="securityManager"/>  
    <property name="loginUrl" value="/login.jsp"/>  
    <property name="successUrl" value="/list.jsp"/>  
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>  
   
    <!-- 配置哪些页面需要受保护.  以及访问这些页面需要的权限.  
       1). anon 可以被匿名访问  
       2). authc 必须认证(即登录)后才可能访问的页面.  
       3). logout 登出.  
       4). roles 角色过滤器  
    -->  
    <property name="filterChainDefinitions">  
        <value>  
            /index.jsp = anon  
            /login.jsp = anon  
            /shiro/login = anon  
            /shiro/logout = logout  
  
            /user.jsp = roles[user]  
            /admin.jsp = roles[admin]  
  
            # everything else requires authentication:  
            /** = authc  
        </value>  
    </property>  
</bean>

但是这种方式是有缺陷的,一般我们会从数据库中读取权限,然后进行设置,所以可以对上面的配置方式进行改造,通过工厂方法创建bean

public class FilterChainDefinitionMapBuilder {

	public LinkedHashMap<String, String> buildFilterChainDefinitionMap(){
		LinkedHashMap<String, String> map = new LinkedHashMap<>();
		map.put("index.jsp", "anon");
		map.put("/login.jsp", "anon");
		map.put("/shiro/login", "anon");
		map.put("/shiro/logout", "logout");
		map.put("/user.jsp", "authc,roles[user]");
		map.put("/admin.jsp", "authc,roles[admin]");
		map.put("/list.jsp", "user");
		
		map.put("/**", "authc");
		
		return map;
	}
}
<!--配置 ShiroFilter,id 必须和 web.xml 文件中配置的 DelegatingFilterProxy<filter-name> 一致. 若不一致, 则会抛出: NoSuchBeanDefinitionException. 因为 Shiro 会来 IOC 容器中查找和 <filter-name> 名字对应的 filter bean.-->  
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
    <property name="securityManager" ref="securityManager"/>  
    <property name="loginUrl" value="/login.jsp"/>  
    <property name="successUrl" value="/list.jsp"/>  
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>  
      
    <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"></property>  
</bean>  
  
<!-- 配置一个 bean, 该 bean 实际上是一个 Map. 通过实例工厂方法的方式 -->  
    <bean id="filterChainDefinitionMap"  
          factory-bean="filterChainDefinitionMapBuilder" factory-method="buildFilterChainDefinitionMap"></bean>  
  
    <bean id="filterChainDefinitionMapBuilder"  
          class="com.example.factory.FilterChainDefinitionMapBuilder"></bean>

常用权限注解:
在这里插入图片描述

参考

  1. Shiro视频
  2. 若依开源项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/403819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11线程、互斥量以及条件变量

文章目录前言1、创建第一个线程2、线程对象的生命周期、等待和分离3、线程创建的多种方式4、互斥量4.1 独占的互斥量std::mutex4.2 递归独占互斥量recursive_mutex4.3 带超时的互斥量std::timed_mutex和std::recursive_timed_mutex4.4 std::lock_guard和std::unique_lock5、cal…

CSS常用内容总结(扫盲)

文章目录前言相关概念【了解】脚本语言什么是脚本语言脚本语言有什么特点常见的脚本语言什么是动态语言&#xff0c;什么是静态语言动态语言和静态语言两者之间有何区别CSSCSS是什么CSS的特点一、CSS代码怎么写基本语法规则引入方式内部样式内联样式表外部样式代码风格二、CSS的…

JavaWeb——进程详解

目录 一、操作系统 1、定义&#xff1a; 2、操作系统的基本功能&#xff1a; 二、进程 1、定义&#xff1a; 三、进程管理 1、PCB定义 &#xff08;1&#xff09;、身份标识 &#xff08;2&#xff09;、内存指针 &#xff08;3&#xff09;、文件描述符 2、操作系统…

Hadoop入门常见面试题与集群时间同步操作

目录 一&#xff0c;常用端口号 Hadoop3.x &#xff1a; Hadoop2.x&#xff1a; 二&#xff0c;常用配置文件&#xff1a; Hadoop3.x: Hadoop2.x: 集群时间同步&#xff1a; 时间服务器配置&#xff08;必须root用户&#xff09;&#xff1a; &#xff08;1&#xff09…

1639_perror的函数功能以及简单测试

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 继续分析之前的shell程序代码&#xff0c;看到了一个fork1的实现。 Fork之前还是看过的&#xff0c;但是也已经忘得差不多了&#xff0c;这个fork1就是fork的一种应…

4.Spring Cloud (Hoxton.SR8) 学习笔记—Nacos微服务治理

本文目录如下&#xff1a;一、Nacos微服务治理Nacos 下载 与 启动Spring Cloud 集成 NacosIDEA 同一个 Application 启动多次一、Nacos微服务治理 Nacos 下载 与 启动 https://github.com/alibaba/nacos/releases Nacos 下载与启动: F:\ProgramFiles\nacos\bin> .\startup…

MyBatis操作数据库

目录 MyBatis 功能架构 学习MyBatis 第一个MyBatis查询 1、创建数据库和表 2、搭建MyBatis开发环境 2.1、在项目中添加MyBatis框架 2.2、配置数据库连接信息 2.3、配置MyBatis中xml的保存路径&#xff08;规则&#xff09; 3、添加业务代码 3.1、创建实体类 3.2、构…

stack,queue

stack,queuestack的介绍和使用介绍使用模拟实现queue的介绍和使用介绍使用模拟实现priority_queue的介绍和使用介绍使用模拟实现容器适配器概念标准库中stack&#xff0c;queue的底层结构介绍deque原理缺陷deque作为stack,queue底层默认容器stack的介绍和使用 介绍 stack是适…

哪个牌子的蓝牙耳机音质好?音质比较好的蓝牙耳机排名

蓝牙耳机经过多年发展&#xff0c;无论是在外观设计还是性能配置上都有很大的进步&#xff0c;越来越多的蓝牙耳机开始注重音质表现&#xff0c;逐渐有HIFI音质、无损音质出现在大众视野。那么哪个牌子的蓝牙耳机音质好&#xff1f;接下来&#xff0c;我来给大家分享几款音质比…

【H2实践】之 SpringBoot 与 H2 数据交互

一、目标 本文是【H2实践】之认识 H2&#xff0c;【H2实践】之 SpringBoot 整合的后续。前文分别介绍了 H2 及其简单使用&#xff0c;并完成了 H2 与 SpringBoot 的整合。本文将紧接 【H2实践】之 SpringBoot 整合 探索实用 SpringBoot 结合 JPA 通过 web 接口操作 H2 数据库的…

Python数据分析案例22——财经新闻可信度分析(线性回归,主成分回归,随机森林回归)

本次案例还是适合人文社科领域&#xff0c;金融或者新闻专业。本科生做线性回归和主成分回归就够了&#xff0c;研究生还可以加随机森林回归&#xff0c;其方法足够人文社科领域的硕士毕业论文了。 案例背景 有八个自变量&#xff0c;[微博平台可信度,专业性,可信赖性,转发量,…

Java对象结构与内置锁

Java对象结构与内置锁 Java内置锁的很多重要信息都存放在对象结构中 1.Java对象结构 Java对象包括三部分&#xff1a;对象头、实例数据和对齐字节 对象头&#xff1a; 第一个字段叫做Mark Word&#xff0c;用于存储自身运行时数据&#xff0c;例如GC标志位&#xff0c;哈希…

P1120 小木棍(搜索+剪枝)

题目链接&#xff1a;P1120 小木棍 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例输入&#xff1a; 9 5 2 1 5 2 1 5 2 1 样例输出&#xff1a; 6 分析&#xff1a;这道题一看数据范围就知道是搜索&#xff0c;但关键是需要剪枝。 首先我们求出所有木棍的长度和&am…

什么是刺猬理念

一、什么是刺猬理念刺猬理念是指把复杂的世界简化成单个有组织性的观点&#xff0c;一条基本原则或一个基本理念&#xff0c;发挥统帅和指导作用。核心是把事情简单化&#xff0c;把所有的挑战和进退维谷的局面压缩为简单的。二、刺猬理念的寓言故事狐狸是一种狡猾的动物&#…

Maix Bit(K210)保姆级入门上手教程---自训练模型之云端训练

Maix Bit&#xff08;K210&#xff09;保姆级入门上手教程系列 Maix Bit&#xff08;K210&#xff09;保姆级入门上手教程—环境搭建 Maix Bit&#xff08;K210&#xff09;保姆级入门上手教程—外设基本使用 这是K210快速上手系列文章&#xff0c;主要内容是&#xff0c;介绍…

《机器学习》基础概念之【P问题】与【NP问题】

《机器学习》基础概念之【P问题】与【NP问题】 这里写目录标题《机器学习》基础概念之【P问题】与【NP问题】一、多项式&时间复杂度1.1. 多项式1.2.时间复杂度二、P问题 & NP问题2.1. P问题2.2.NP问题2.3.举例理解NP问题-TSP旅行商推销问题三、NP-hard问题&NP-C问题…

PMP项目管理项目成本管理

目录1 项目成本管理概述2 规划成本管理3 估算成本4 制定预算5 控制成本1 项目成本管理概述 项目成本管理包括为使项目在批准的预算内完成而对成本进行规划、估算、预测、融资、筹资、管理和控制的各个过程&#xff0c;从而确保项目在批准的预算内完工。核心概念 项目成本管理旨…

vuex getters的作用和使用(求平均年龄),以及辅助函数mapGetters

getters作用&#xff1a;派生状态数据mapGetters作用&#xff1a;映射getters中的数据使用&#xff1a;方法名自定义&#xff0c;系统自动注入参数&#xff1a;state&#xff0c;每一个方法中必须有return&#xff0c;其return的结果被该方法名所接收。在state中声明数据listst…

PyTorch深度学习实战 | 计算机视觉

深度学习领域技术的飞速发展&#xff0c;给人们的生活带来了很大改变。例如&#xff0c;智能语音助手能够与人类无障碍地沟通&#xff0c;甚至在视频通话时可以提供实时翻译&#xff1b;将手机摄像头聚焦在某个物体上&#xff0c;该物体的相关信息就会被迅速地反馈给使用者&…

【教学典型案例】21.面向对象复用、面向对象实现、立体化权限落地

目录一&#xff1a;背景介绍1、针对于激励配置的功能体现出来的&#xff1a;面向对象的思想就可以实现极大程度的复用性的问题2、脱离学习通设计图&#xff0c;过程化&#xff0c;如何用面向对象的思想来去组织管理流程图3、词云位置记录定制化二&#xff1a;思路&方案1、面…