shiro
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
主要功能
三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
************************************************************以上内容来自百度百科**************************************************************
① 认识shiro的整体架构,各组件的概念
② shiro认证,授权的过程
③ shiro自定义的realm、Filter
④ shiro session管理
⑤ shiro的缓存管理
⑥ shiro继承spring
① shiro是Apache提供的一个强大灵活的安全框架
② shiro提供了认证、授权、企业会话管理、加密、缓存管理相关的功能,使用shiro可以非常方便的完成项目的权限管理模块开发
三、shiro与spring Security的比较(spring的官网也是用shiro做安全管理的)
① Apache shiro: 简单灵活、可脱离spring、粒度较粗
② spring Security: 复杂笨重、不可脱离spring、粒度更细
四、Shiro的整体架构(下图来自shiro官网提供的整体架构图)
①上面标记为1的是shiro的主体部分subject,可以理解为当前的操作用户
② Security Manager为Shiro的核心,shiro是通过security Manager来提供安全服务的,security Manager管理着Session Manager、Cache Manager等其他组件的实例:Authenticator(认证器,管理我们的登录登出) Authorizer(授权器,负责赋予主体subject有哪些权限) Session Manager(shiro自己实现的一套session管理机制,可以不借助任何web容器的情况下使用session) Session Dao(提供了session的增删改查操作) cache Manager(缓存管理器,用于缓存角色数据和权限数据) Pluggable Realms(shiro与数据库/数据源之间的桥梁,shiro获取认证信息、权限数据、角色数据都是通过Realms来获取)
③ 上图标记为2的cryptography是用来做加密的,使用它可以非常方便快捷的进行数据加密。
④ 上面箭头的流程可以这样理解:主体提交请求到Security Manager,然后由Security Manager调用Authenticator去做认证,而Authenticator去获取认证数据的时候是通过Realms从数据源中来获取的,然后把从数据源中拿到的认证信息与主体提交过来的认证信息做比对。授权器Authorizer也是一样。
① 创建Security Manager:Security Manager是用来提供安全服务的,所以在做shiro认证的时候要先创建此对象
② 主体Subject提交请求给Security Manager
③ Security Manager调用Authenticator组件做认证
④Authenticator通过Realm来从数据源中获取认证数据
***以下通过代码来演示shiro是如何做认证的***
添加依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
package com.hnlrkj.talentgift;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
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;
/**
* @author: 麟睿科技
* @date: 2021/5/25
* @description: 学习shiro,Shiro的认证
*/
public class AuthenticationTest {
// 创建realm
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
// 认证之前先添加一个账户(相当于在数据库添加了一个账号),创建Security Manager时要用到realm
@Before
public void addUser() {
simpleAccountRealm.addAccount("laiyanqi", "123456", "admin", "superAdmin");
}
@Test
public void testAuthenication() {
// 先构建Security Manager
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(simpleAccountRealm);
// 获取向Security Manager提交的Subject,而subject可以通过Shiro的工具类SecurityUtils获取
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
// 主体subject提交请求给Security Manager --> subject.login(token),token是一个UsernamePasswordToken对象(相当于从前台传递的对象),
UsernamePasswordToken token = new UsernamePasswordToken("laiyanqi", "123456");
subject.login(token);
// shiro提供了检查主体subject是否认证成功isAuthenticated()的方法,如果两边的数据不一致,则为false
subject.isAuthenticated();
System.out.println("subject.isAuthenticated() = " + subject.isAuthenticated());
// 单个授权
//subject.checkRole("admin");
// 多个授权
//subject.checkRoles("admin", "superAdmin");
// 主体subject登出,