Shiro学习记录

本文详细介绍了Apache Shiro安全框架,包括其核心组件Subject、SecurityManager和Realm,以及Shiro的认证、授权过程。文章还探讨了自定义Realm、加密、过滤器和缓存管理,特别提到了如何提高性能通过整合Redis缓存。此外,对比了Shiro与Spring Security的特点,并展示了Shiro的认证代码示例和自定义过滤器实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shiro

(java安全框架)

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自定义的realmFilter

shiro session管理

shiro的缓存管理

shiro继承spring

 

二、shiro安全框架的简介

shiroApache提供的一个强大灵活的安全框架

shiro提供了认证、授权、企业会话管理、加密、缓存管理相关的功能,使用shiro可以非常方便的完成项目的权限管理模块开发

 

三、shiro与spring Security的比较(spring的官网也是用shiro做安全管理的)

Apache shiro     简单灵活、可脱离spring、粒度较粗

spring Security  复杂笨重、不可脱离spring、粒度更细

 

四、Shiro的整体架构(下图来自shiro官网提供的整体架构图)

https://i-blog.csdnimg.cn/blog_migrate/f27478021207e81956a4c0b649d07b55.png

上面标记为1的是shiro的主体部分subject,可以理解为当前的操作用户

Security ManagerShiro的核心,shiro是通过security Manager来提供安全服务的,security Manager管理着Session ManagerCache Manager等其他组件的实例:Authenticator(认证器,管理我们的登录登出)  Authorizer(授权器,负责赋予主体subject有哪些权限) Session Manager(shiro自己实现的一套session管理机制,可以不借助任何web容器的情况下使用session) Session Dao(提供了session的增删改查操作) cache Manager(缓存管理器,用于缓存角色数据和权限数据) Pluggable Realms(shiro与数据库/数据源之间的桥梁,shiro获取认证信息、权限数据、角色数据都是通过Realms来获取

上图标记为2cryptography是用来做加密的,使用它可以非常方便快捷的进行数据加密。

上面箭头的流程可以这样理解:主体提交请求到Security Manager,然后由Security Manager调用Authenticator去做认证,而Authenticator去获取认证数据的时候是通过Realms从数据源中来获取的,然后把从数据源中拿到的认证信息与主体提交过来的认证信息做比对。授权器Authorizer也是一样。

 

五、Shiro的认证

创建Security ManagerSecurity 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:
学习shiroShiro的认证
 
*/

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登出,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值