Shiro 权限管理入门之认证与授权

article/2025/9/19 20:17:17

Shiro

  • 权限管理
    • 什么是权限管理?
    • 什么是身份认证?
    • 什么是授权?
  • Shiro 是什么?
  • Shiro 的核心架构
  • Shiro 中的认证
    • 认证关键对象
    • 认证流程
    • 认证的开发
    • 自定义 Realm
      • SimpleAccountRealm
      • 开发自定义 Realm
    • MD5 和 Salt
      • 自定义 md5 + salt 的 Realm 并验证
  • Shoiro 中的授权

权限管理

什么是权限管理?

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

权限管理包括用户 身份认证授权 两部分,简称 认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

什么是身份认证?

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。

什么是授权?

授权,即 访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

Shiro 是什么?

官方介绍:

Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.

Shiro 是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序—从最小的移动应用程序到最大的web和企业应用程序。


简单来说,Shiro 是 apache 旗下一个 开源框架,它将软件系统的安全认证相关的功能抽取出来,实现 用户身份认证,权限授权、加密、会话管理 等功能,组成了一个 通用的安全认证框架

Shiro 的核心架构

在这里插入图片描述
Subject:主体

  • 外部应用与 Subject 进行交互,Subject 记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。 Subject 在 Shiro 中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过 Subject 进行认证授权,而 Subject 是通过 SecurityManager 安全管理器进行认证授权;

SecurityManager:安全管理器

  • 对全部的 Subject 进行安全管理,它是 Shiro 的核心,负责对所有的 Subject 进行安全管理。通过SecurityManager 可以完成对 Subject 的认证、授权等,实质上 SecurityManager 是通过 Authenticator 进行认证,通过 Authorizer 进行授权,通过 SessionManager 进行会话管理等。
  • SecurityManager 是一个接口,继承了 Authenticator、Authorizer、SessionManager 这三个接口。

Authenticator:认证器

  • 对用户身份进行认证,Authenticator 是一个接口,Shiro 提供 ModularRealmAuthenticator 实现类,通过 ModularRealmAuthenticator 基本上可以满足大多数需求,也可以 自定义认证器

Authorizer:授权器

  • 用户通过认证器认证通过,在访问功能时需要通过授权器 判断用户是否有此功能的操作权限

Realm:领域

  • 相当于 datasource 数据源,securityManager 进行安全认证需要 通过 Realm 获取用户权限数据,比如:如果用户身份数据在数据库那么 Realm 就需要从数据库获取用户身份信息。
    注意:不要把 Realm 理解成只是从数据源取数据,在 Realm 中还有认证授权校验的相关的代码。

SessionManager:会话管理
Shiro 框架定义了一套会话管理,它不依赖 web 容器的 session,所以 Shiro 可以使用在非 web 应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现 单点登录(多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统)。

SessionDAO:会话DAO
SessionDAO 是对 session 会话操作的一套接口,比如要将 session 存储到数据库,可以通过 JDBC 将会话存储到数据库。

CacheManager:缓存管理
CacheManager 将用户权限数据存储在缓存,这样可以提高性能。

Cryptography:密码管理
Shiro 提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

Shiro 中的认证

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。

认证关键对象

  • Subject:主体
    访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;
  • Principal:身份信息
    身份信息是主体 (subject) 进行身份认证的标识,标识必须具有 唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)
  • credential:凭证信息
    凭证信息是只有主体自己知道的安全信息,如密码、证书等。

认证流程

在这里插入图片描述

认证的开发

创建项目并引入依赖:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.5.3</version>
</dependency>

引入 shiro.ini 配置文件并添加如下配置:

zhenyu=123
zhangsan=456

在这里插入图片描述
编写进行认证的代码:

public class TestAuthenticator {public static void main(String[] args) {// 创建安全管理器对象DefaultSecurityManager securityManager = new DefaultSecurityManager();// 给安全管理器设置realm, 从配置文件中获取数据securityManager.setRealm(new IniRealm("classpath:shiro.ini"));// 给全局安全工具类设置默认安全管理器SecurityUtils.setSecurityManager(securityManager);// 获取主体对象Subject subject = SecurityUtils.getSubject();// 创建token令牌UsernamePasswordToken token = new UsernamePasswordToken("zhenyu", "123");try {// 用户登录System.out.println("认证状态:" + subject.isAuthenticated());subject.login(token);System.out.println("认证状态:" + subject.isAuthenticated());} catch (UnknownAccountException e) { // 用户名不存在异常e.printStackTrace();System.out.println("认证失败: 用户名不存在!");} catch (IncorrectCredentialsException e) { // 密码错误异常e.printStackTrace();System.out.println("认证失败: 密码错误!");}}
}
  • DisabledAccountException(帐号被禁用)

  • LockedAccountException(帐号被锁定)

  • ExcessiveAttemptsException(登录失败次数过多)

  • ExpiredCredentialsException(凭证过期)

自定义 Realm

SimpleAccountRealm

上边的程序使用的是 Shiro 自带的 IniRealmIniRealmini配置文件 中读取用户的信息,实际中大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义 Realm。

Shiro 提供过的 Realm:
在这里插入图片描述
根据认证源码,认证使用的是 SimpleAccountRealm
在这里插入图片描述
SimpleAccountRealm 的部分源码中有两个方法一个是 认证,一个是 授权;

认证方法 doGetAuthenticationInfo:
在这里插入图片描述

开发自定义 Realm

自定义 Realm,编写一个 CustomerRealm:

/*** 自定义realm实现 将认证|授权数据的来源转为数据库的实现*/
public class CustomerRealm extends AuthorizingRealm {// 授权方法@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}// 认证方法@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 在token中获取用户名String principal = (String) token.getPrincipal();System.out.println(principal);// 根据身份信息连接数据库查询相关数据库if ("zhenyu".equals(principal)) {// 参数1:返回数据库中正确的用户名// 参数2:返回数据库中正确密码// 参数3:提供当前realm的名字 this.getName();return new SimpleAuthenticationInfo(principal, "123", this.getName());}return null;}
}

使用自定义 Realm 进行认证:

/*** 使用自定义realm*/
public class TestCustomerRealmAuthenticator {public static void main(String[] args) {// 创建securityManagerDefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();// 设置自定义realmdefaultSecurityManager.setRealm(new CustomerRealm());// 给全局安全工具类设置默认安全管理器SecurityUtils.setSecurityManager(defaultSecurityManager);// 通过安全工具类获取subjectSubject subject = SecurityUtils.getSubject();// 创建tokenUsernamePasswordToken token = new UsernamePasswordToken("zhenyu", "123");try {subject.login(token);System.out.println("认证状态: " + subject.isAuthenticated());} catch (UnknownAccountException e) {e.printStackTrace();System.out.println("用户名错误!");} catch (IncorrectCredentialsException e) {e.printStackTrace();System.out.println("密码错误!");}}
}

MD5 和 Salt

实际应用是将 散列后的值 存在数据库中,Realm 从数据库取出盐和加密后的值由 Shiro 完成密码校验。
在这里插入图片描述
Md5Hsah 类的简单使用:

public class TestShiroMD5 {public static void main(String[] args) {// 使用 MD5Md5Hash md5Hash = new Md5Hash("1234");System.out.println(md5Hash.toHex());// 81dc9bdb52d04dc20036dbd8313ed055// 使用 Md5 + saltMd5Hash md5Hash1 = new Md5Hash("1234", "X0*7ps");System.out.println(md5Hash1);// 6029a2a0be49f2d4f21941c8ae2cea0c// 使用 Md5 + salt + hash 散列Md5Hash md5Hash2 = new Md5Hash("1234", "X0*7ps", 1024);System.out.println(md5Hash2.toHex());// 67cdf0cac7bdd508f560ef7965e8934c}
}

自定义 md5 + salt 的 Realm 并验证

自定义 Realm 类:

/*** 自定义md5+salt realm*/
public class CustomerMd5Realm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String principal = (String) token.getPrincipal();if ("zhenyu".equals(principal)) {String password = "6029a2a0be49f2d4f21941c8ae2cea0c";String salt = "X0*7ps";return new SimpleAuthenticationInfo(principal, password,ByteSource.Util.bytes(salt), this.getName());}return null;}
}
public class TestCustomerRealmAuthenticator {public static void main(String[] args) {// 创建securityManagerDefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();// 设置为自定义realm获取认证数据CustomerMd5Realm customerMd5Realm = new CustomerMd5Realm();// 设置md5加密HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();credentialsMatcher.setHashAlgorithmName("MD5"); // 设置使用的加密算法credentialsMatcher.setHashIterations(1024); // 设置散列次数customerMd5Realm.setCredentialsMatcher(credentialsMatcher);defaultSecurityManager.setRealm(customerMd5Realm);// 安装工具类中设置默认安全管理器SecurityUtils.setSecurityManager(defaultSecurityManager);// 获取主体对象Subject subject = SecurityUtils.getSubject();// 创建token令牌UsernamePasswordToken token = new UsernamePasswordToken("zhenyu", "1234");try {subject.login(token);//用户登录System.out.println("登录成功~~");} catch (UnknownAccountException e) {e.printStackTrace();System.out.println("用户名错误!!");} catch (IncorrectCredentialsException e) {e.printStackTrace();System.out.println("密码错误!!!");}}
}

Shoiro 中的授权


http://chatgpt.dhexx.cn/article/MA2nerOo.shtml

相关文章

Shiro权限管理详解

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

Shiro权限控制

目录 认识Shiro的整体架构&#xff0c;各组件的概念简介Shiro与Spring Security比较Shiro整体架构 Shiro认证&#xff0c;授权的过程shiro认证Shiro授权 Shiro自定义的Realm&#xff0c;FilterIniRealm配置文件JdbcRealm自定义Realmshiro加密 Shiro Session管理Shiro 缓存管理S…

Shiro权限管理框架详解

1 权限管理1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权…

Shiro 权限管理

一共5个表 用户表角色表权限表用户角色中间表角色权限中间表 权限验证 用户不跟权限直接关联&#xff0c; 可以给用户多个角色&#xff0c; 每个角色都有对应的权限&#xff0c;所以给用户加一个角色&#xff0c;就相当于&#xff0c;给用户赋了对应的权限。一个用户可以有多…

Shiro: 权限管理

一、权限管理 1、什么是权限管理 权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问且只能访问自己被授权的资源。   权限管理包括用户身份认证和授权两部分&#xff0c;简称认证授权。对于需要…

【权限管理框架】一文看懂Shiro权限管理框架!

文章目录 1.JavaWeb中的权限控制2.权限框架核心知识ACL和RBAC2.1.ACL和RBAC简介2.2主流权限框架介绍 3.Shiro架构和基本概念3.1.Shiro的4大核心模块3.2.Shiro权限控制运行流程 4.Shiro简单API案例4.1.项目搭建所需依赖4.2.Shiro认证简单实操4.3.Shiro授权简单实操 5.安全数据来…

【端口扫描工具】nmap核心使用方法

目录 nmap的基础使用&#xff1a; 1.1、常用命令参数&#xff1a; 命令格式&#xff1a; 主机发现&#xff1a; 扫描 扫描速度 扫描端口 1.2、基本扫描 1.3、自定义端口扫描 1.4、Ping扫描 1.5、路由追踪 1.6、扫描网段,C段 1.7、操作系统类型的探测 1.8、nmap万能…

【安全工具】Nmap基本使用方法

Nmap工具介绍 Nmap是一款开放源代码的网络探测和安全审核工具&#xff0c;它被设计用来快速扫描大型网络、包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹、WAF识别及常见安全漏洞。 它的图形化界面是 Zenmap、分布式框架为 Dnmap Nmap功能 主机探测&#xf…

nmap工具使用方法

nmap工具使用方法 简介 Nmap&#xff08;网络映射器&#xff09;是一个用于网络探索和安全审计的开源工具 常用扫描端口命令 <nmap -sV 192.168.204.64> -sV&#xff1a;探测端口服务版本<nmap -T4 -A -v 192.168.204.64> -T4&#xff1a; 指定扫描过程使用的时…

nmap使用方法--方便自己查

在侦查期间&#xff0c;扫描一直是信息收集的初始阶段。 什么是侦查 侦查是尽可能多收集关于目标网络的信息。从黑客的角度来看&#xff0c;信息收集对于一次攻击非常有用&#xff0c;所以为了封锁恶意的企图&#xff0c;渗透测试者通常尽力查找这些信息&#xff0c;发现后修复…

端口扫描工具Nmap使用方法 day02

nmap是一个网络端口扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端口&#xff0c;确定哪些服务运行在哪些端口&#xff0c;并且推断计算机运行哪个os。它是网络管理员必用的软件之一&#xff0c;渗透测试人员也可以用它评估网络系统安全。下面介绍kali linux中nmap的用…

nmap详细使用教程

目录 nmap简介 nmap常用命令 实例演示-发现主机 实例演示-端口发现 实例演示-获得服务版本详细信息 实例演示-确定主机操作系统 nmap简介 nmap是一款非常强大的主机发现和端口扫描工具&#xff0c;而且nmap运用自带的脚本&#xff0c;还能完成漏洞检测&#xff0c;同时支…

nmap常见使用方法

基础使用&#xff1a; 1.nmap ip 探测目标ip1-10000范围内所有开放端口 比如&#xff1a;扫描192.168.91.1 可以看见&#xff0c;已经扫描出目标IP对应的一些信息了 2.nmap -vv ip 简单扫描&#xff0c;输出详细结果&#xff08;一般没什么用&#xff09; nmap -p port ip …

Nmap 基本使用方法

一、下载工具包 进入官网下载安装包Download the Free Nmap Security Scanner for Linux/Mac/Windows 二、安装zenmap 工具 点击“下一步”安装完成。Zenmap 界面如下 三、Nmap使用 Nmap是主机扫描工具,他的图形化界面是Zenmap,分布式框架为Dnamp。 Nmap可以完成以下任务…

nmap 使用方法详细介绍

nmap的使用 前言nmap 作用Nmap使用教程nmap的基本输入&#xff1a;扫描参数&#xff1a;端口扫描&#xff1a;端口状态扫描&#xff1a;UDP扫描协议扫描 总结Nmap的基础知识Nmap的扫描技术Nmap的OS检测&#xff08;O&#xff09;Nmap的操作系统指纹识别技术&#xff1a; 前言 …

Nmap使用方法及常用命令学习

本文为学习笔记&#xff0c;仅限学习交流。不得利用、从事危害国家或人民安全、荣誉和利益等活动。 请参阅《中华人民共和国网络安全法》 7-30作业 —Nmap 练习 Nmap 是Network Mapper&#xff0c;中文为“网络映射器”。 Nmap 是一款开源的网络探测和安全审核的工具&#xff…

Nmap使用方法简析

NMAP 引子&#xff1a; Nmap&#xff0c; 是 Network Mapper 的缩写&#xff0c;由 Gordon Lyon 维护(更多关于 Mr. Lyon 的信息在这里: http://insecure.org/fyodor/) &#xff0c;并被世界各地许多的安全专业人员使用。 这个工具在 Linux 和 Windows 下都能使用&#xff0…

nmap使用方法详解

Nmap详解 Nmap&#xff08;网络映射器&#xff09;是一款开放源代码的网络探测和安全审核工具&#xff0c;它被设计用来快速扫描大型网络&#xff0c;包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹识别、WAF识别及常见安全漏洞。 Nmap的特点&#xff1a; - 主机…

Nmap的使用方法总结

文章目录 Nmap的使用方法总结一&#xff1a;各种参数的使用1&#xff1a;ping扫描 —— nmap < 要扫描的目标ip地址>2&#xff1a;TCP SYN Ping扫描3&#xff1a;-PA TCP ACK Ping扫描4&#xff1a;半开扫描5&#xff1a;自定义端口扫描 nmap -P&#xff08;扫描范围&…

nmap使用方法

目录 第一、nmap使用 第一、nmap使用 1、nmap扫描一台服务器&#xff0c;默认扫描1000个最有可能开放的TCP端口。 2、-v显示详细信息 3、-p表示端口扫描。 扫描全部端口&#xff0c;查看开放了那些。 4、查看端口正在被那个进程使用 查看22端口正在被那个进程使用。 查看s…