1. 添加依赖

         <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
15 <groupId>org.apache.shiro</groupId>
16 <artifactId>shiro-spring</artifactId>
17 <version>1.4.0</version>
18 </dependency>

2. Shiro认证和授权流程

2.1 常用API:

//是否有对应的角色
subject.hasRole("root")
//获取subject名
subject.getPrincipal()
//检查是否有对应的角色,无返回值,直接在SecurityManager里面进行判断
subject.checkRole("admin")
//检查是否有对应的角色
subject.hasRole("admin")
//退出登录
subject.logout();

2.2 shiro认证流程:

测试代码:

 package net.xdclass.xdclassshiro;

 import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test; /**
* shiro认证过程:
* 1.构造SecurityManager环境
* 2.调用Subject.login()执行认证
* 3.SecurityManager进行认证
* 4.Authenticator执行 认证
* 5.根据realm进行验证
*/
public class QuicksStratTest { /**
* accountRealm 相当于数据库的作用
*/
private SimpleAccountRealm accountRealm = new SimpleAccountRealm(); private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); @Before
public void init() {
//初始化数据源
accountRealm.addAccount("lch", "123");
accountRealm.addAccount("jack", "345");
//构建环境
defaultSecurityManager.setRealm(accountRealm); } @Test
public void testAuthentication() {
//设置当前上下文
SecurityUtils.setSecurityManager(defaultSecurityManager);
//设置当前subject(application应用的user)
Subject subject = SecurityUtils.getSubject();
//模拟用户输入
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lch", "123");
// 实际是调用securityManager的login方法 Subject subject = this.securityManager.login(this, token);
subject.login(usernamePasswordToken);
System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 打印true }
}

上面这个login方法里面 ,会调用认证器对 usernamePasswordToken 中的用户信息进行认证

2.3 shiro授权流程:

测试代码:

 package net.xdclass.xdclassshiro;

 import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test; /**
* shiro授权过程及常用API:
* 1.构造SecurityManager环境
* 2.Subject执行授权
* 3.SecurityManager进行认证授权
* 4.Authenticator执行授权
* 5.根据realm进行授权验证
*/
public class QuicksStratTest2 { /**
* accountRealm 相当于数据库的作用
*/
private SimpleAccountRealm accountRealm = new SimpleAccountRealm(); private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); @Before
public void init() {
//初始化数据源,入参加入用户角色
accountRealm.addAccount("lch", "123","root","admin");
accountRealm.addAccount("jack", "345","user");
//构建环境
defaultSecurityManager.setRealm(accountRealm);
} @Test
public void testAuthentication() {
//设置当前上下文
SecurityUtils.setSecurityManager(defaultSecurityManager);
//设置当前subject(application应用的user)
Subject subject = SecurityUtils.getSubject();
//模拟用户输入
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lch", "123");
// 实际是调用securityManager的login方法 Subject subject = this.securityManager.login(this, token);
subject.login(usernamePasswordToken); System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 结果:true
//最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法
System.out.println("是否有对应的角色:" + subject.hasRole("root")); // 结果:true
//获取登录 账号
System.out.println("getPrincipal():" + subject.getPrincipal()); // getPrincipal():lch
subject.logout();
System.out.println("logout后认证结果:" + subject.isAuthenticated()); //logout后认证结果:false }
}
subject.hasRole()方法,实际上是调用SecurityManager的hasRole方法进行权限校验:

SecurityManager的hasRole方法,又是调用authorizer的hasRole方法去校验,

它有三个实现类:

测试代码中使用的 SimpleAccountRealm 是继承自 AuthorizingRealm,所以这里我们进入第一个实现类AuthorizingRealm 里面,发现它的授权逻辑如下:

shiro框架学习-2-springboot整合shiro及Shiro认证授权流程的更多相关文章

  1. 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战

    ========================11.Logback日志框架介绍和SpringBoot整合实战 2节课================================ 1.新日志框架L ...

  2. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例

    1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...

  3. shiro框架学习-5-自定义Realm

    1. 自定义Realm基础 步骤: 创建一个类 ,继承AuthorizingRealm->AuthenticatingRealm->CachingRealm->Realm 重写授权方 ...

  4. shiro框架学习-1-shiro基本概念

    1. 什么是权限控制 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源, ...

  5. shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

    1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...

  6. shiro框架学习-8-shiro缓存

    1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有 ...

  7. shiro框架学习-4- Shiro内置JdbcRealm

    1.  JdbcRealm 数据库准备 JdbcRealm就是用户的角色,权限都从数据库中读取,也就是用来进行用户认证授权的安全数据源更换为从数据库中读取,其他没有差别,首先在数据库创建三张表: CR ...

  8. Activiti工作流学习之SpringBoot整合Activiti5.22.0实现在线设计器(二)

    一.概述 网上有很多关于Eclipse.IDEA等IDE插件通过拖拽的方式来画工作流程图,个人觉得还是不够好,所以花点时间研究了一下Activiti在线设计器,并与SpringBoot整合. 二.实现 ...

  9. Java学习之SpringBoot整合SSM Demo

    背景:在Java Web中Spring家族有着很重要的地位,之前JAVA开发需要做很多的配置,一堆的配置文件和部署调试一直是JavaWeb开发中的一大诟病,但现在Spring推出了SpringBoot ...

随机推荐

  1. 【MM系列】SAP S/4 HANA 1511的BP角色创建及供应商数据的创建方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA 1511的 ...

  2. P1596 【[USACO10OCT]湖计数Lake Counting】

    可爱的题面君~~ 个人感觉这题还是很简单的,就是一个完全不加工的找联通块个数 个人解题思路是先读入,然后循环一遍,遇到水就dfs,并把这个w所在的联通块“删除”,并在答案上加一 最后输出答案 具体注释 ...

  3. 删除mysl

    mysql卸载不干净会很麻烦 1.yum remove mysql mysql-server mysql-libs compat-mysql51 2.rm -rf /var/lib/mysql 检查是 ...

  4. 换根dp特征总结

    Rt,大概总结一下吧(不时更新一小下 1.一般都没有指定根,刚开始随便选一个根(1号点工具人) 2.两次$dfs$,一次从工具人开始预处理一些东西,第二次(也是从工具人开始)换根. 3.多用于:只要确 ...

  5. 【神经网络与深度学习】【CUDA开发】【VS开发】Caffe+VS2013+CUDA7.5+cuDNN配置过程说明

    [神经网络与深度学习][CUDA开发][VS开发]Caffe+VS2013+CUDA7.5+cuDNN配置过程说明 标签:[Qt开发] 说明:这个工具在Windows上的配置真的是让我纠结万分,大部分 ...

  6. vue-cli3.0使用及部分配置详解

    1.检测安装   vue-V 2.创建项目命令:(官网) 3.简单的配置信息 这里如果你是第一次用3.0版本的话,是没有前两个的,而只有最后两个,这里是 让你选的,第一个是默认配置,一般选第二个,自己 ...

  7. 13.56Mhz/NFC读写器天线阻抗匹配调试步骤-20191128

    相关原文: https://blog.csdn.net/wwt18811707971/article/details/80641432 http://www.52rd.com/Blog/Detail_ ...

  8. 洛谷 P1197 星球大战 题解

    题面 并查集处理问题的基本思路:如果不是强制在线那么可以倒着处理,把删边改为可爱的加边,然后使用并查集来判断是否联通: 所以可以较为轻松的写出AC代码: #include <bits/stdc+ ...

  9. Java Web开发技术教程入门-JSP基本语法和九大内置对象

    这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...

  10. Redis启动方式

    一.前端启动 直接运行bin/redis-server将以前端模式启动.[bin目录是在/usr/local/redis/bin] # ./redis-server 启动缺点: ssh命令窗口关闭则r ...