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. 【推荐算法工程师技术栈系列】程序语言--Java

    目录 JDK 初步 ArrayList LinkedList Vector Stack HashMap Hashtable LinkedHashMap TreeMap HashSet LinkedHa ...

  2. 【VS开发】利用VS2015的工程文件来复制另外一个工程的配置的使用说明

    [VS开发]利用VS2015的工程文件来复制另外一个工程的配置的使用说明 标签:[VS开发] 说明:总是有时候会遇到这样的问题,在一个工程中完成了对某些PKG包的包含,包括头文件和库等都能发现,但是我 ...

  3. (转)Maven的pom.xml文件配置使用

    转载:http://www.cnblogs.com/GarfieldTom/p/3707160.html <project xmlns="http://maven.apache.org ...

  4. Java基础(四)

    概述 常用快捷键 数组 概述 数组是一种引用类型.变量只可以存放一个数据,数组则可以存放多个类型统一的数据,可以存放基本类型,也可以存放引用类型. 如果需要存储的数据很多,那么定义多个变量很麻烦: I ...

  5. vue-loader介绍和单页组件介绍

    $ \es6\sing-file>  npm install vue-loader@14.1.1 -D vue-template-compiler@2.5.17 -D npm install v ...

  6. java_时间戳与Date_相互转化的实现代码

    转载自: java_时间戳与Date_相互转化的实现代码

  7. python with hadoop

    python with  hdfs hdfs 可以在 linux 本地操作 bin/hdfs dfs -ls /foo 但是这种只能在 命令行 操作. 通常我们需要在程序中实现远程操作,python ...

  8. spring boot 是如何加载jackson的?

    Spring Boot 自动引入jackson: 通过:Spring-Boot-starter-web Jackson自动配置 这里的configurations是读取的这里: 通过反射加载Jacks ...

  9. Python 进阶篇

    作者:武沛齐 出处:http://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这 ...

  10. JVM 之类加载器

    一.什么是 JVM JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程.当 Java 源文件能被成功编译成 .class 文件 ...