Shiro(认证Authentication)

Shiro简介

Apache Shiro是一个强大且灵活的开源安全框架,它提供了身份验证、授权、密码学和会话管理等一系列安全相关的功能。Shiro的设计目标是易于使用,同时保持强大的安全性。它可以在任何Java应用程序中使用,无论是简单的Java SE应用程序还是复杂的Java EE企业级应用。

Shiro的四大基石

  1. Authentication(认证)

    • 认证,也称为登录,是验证用户身份的过程。
    • 用户需要提供身份(principals)和凭证(credentials)给Shiro,以便Shiro能够验证用户的身份。
    • 身份通常是用户名或电子邮件地址,而凭证通常是密码。
  2. Authorization(授权)

    • 授权是验证用户是否拥有访问某个资源或执行某个操作的权限的过程。
    • Shiro通过Realm获取用户的角色和权限信息,并根据这些信息来判断用户是否有权访问某个资源或执行某个操作。
    • 授权机制可以基于角色(RBAC)或基于权限(PBAC)来实现。
  3. Session Management(会话管理)

    • 会话管理是指管理用户登录后的会话信息。
    • Shiro提供了会话的创建、获取、销毁和超时等管理操作。
    • 通过会话管理,Shiro可以跟踪用户的登录状态和会话信息,并在用户注销或会话超时后销毁会话。
  4. Cryptography(加密)

    • 加密是保护数据安全的重要手段。
    • Shiro提供了密码加密、散列和盐值等密码学功能,以确保用户密码和其他敏感数据的安全存储和传输。
    • 加密机制可以防止数据在传输过程中被窃取或篡改,从而确保数据的完整性和保密性。

这四大基石共同构成了Shiro安全框架的基础,使得Shiro能够为用户提供全面、可靠的安全保障。通过合理的配置和使用,Shiro可以有效地提高应用程序的安全性,并保护用户的隐私和数据安全。

Shiro的核心组件

  1. Subject:代表当前操作的用户,可以是任何与软件交互的实体。Subject提供了与当前用户交互的API,如登录、注销、获取会话等。

  2. SecurityManager:Shiro的核心,它管理着所有的Subject,并与Shiro的其他组件进行交互。SecurityManager负责协调Shiro的安全操作,如身份验证、授权等。

  3. Realm:Shiro与数据源(如数据库、LDAP等)之间的桥梁。Realm负责获取安全数据(如用户、角色、权限等),并将其提供给Shiro的其他组件使用。

SpringBoot整合Shiro架构实现认证

自定义Realm

自定义Realm需要继承AuthorizingRealm类,该类封装了很多方法,且继承自Realm类。

继承AuthorizingRealm类后,我们需要重写以下两个方法:

doGetAuthorizationInfo()方法:获取权限信息

doGetAuthenticationInfo()方法:获取身份信息

package com.ktjiaoyu.thymeleaf.config.shiro;import com.ktjiaoyu.thymeleaf.entity.Role;
import com.ktjiaoyu.thymeleaf.entity.RoleRight;
import com.ktjiaoyu.thymeleaf.entity.User;
import com.ktjiaoyu.thymeleaf.service.UserService;
import jakarta.annotation.Resource;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;import java.util.Set;/*** @author cuishujian* @date 2024/9/29*/
public class MyShirRealm extends AuthorizingRealm {@Resourceprivate UserService userService;@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("调用MyShiroRealm.doGetAuthorizationInfo获取权限信息");// 获取权限信息User user = (User) principalCollection.getPrimaryPrincipal();SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();// 这里我们暂时先不授予权限信息,在下一个Shiro(授权Authorization)再实现return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("调用MyShiroRealm.doGetAuthenticationInfo获取身份信息!");// 获得身份信息UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String usrName = token.getUsername();User user = userService.getUserByUsrName(usrName);System.out.println(user);if (user == null){throw new UnknownAccountException(); // 账号错误}if (user.getUsrFlag() == null || user.getUsrFlag().intValue() == 0){throw new LockedAccountException(); // 账号锁定}SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getUsrPassword(),getName());return info;}
}

配置Shiro相关对象

package com.ktjiaoyu.thymeleaf.config.shiro;import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.alibaba.druid.sql.visitor.functions.Right;
import com.ktjiaoyu.thymeleaf.entity.RoleRight;
import com.ktjiaoyu.thymeleaf.service.RoleService;
import com.ktjiaoyu.thymeleaf.service.impl.RoleServiceImpl;
import jakarta.annotation.Resource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;/*** @author cuishujian* @date 2024/9/29*/
@Configuration
public class ShiroConfig {@ResourceRoleService roleService;@Beanpublic MyShirRealm myShirRealm(){ // 自定义RealmSystem.out.println("【myShirRealm】");MyShirRealm shirRealm = new MyShirRealm();return shirRealm;}@Beanpublic SecurityManager securityManager(){ // 安全管理器 SecurityManagerSystem.out.println("【securityManager】");DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 注入RealmsecurityManager.setRealm(myShirRealm());SecurityUtils.setSecurityManager(securityManager);return securityManager;}@Beanpublic ShiroFilterFactoryBean shiroFilterFactory(SecurityManager securityManager){ // Shiro过滤器:权限验证System.out.println("【shiroFilterFactory】");ShiroFilterFactoryBean shiroFilterFactory = new ShiroFilterFactoryBean();// 注入SecurityManagershiroFilterFactory.setSecurityManager(securityManager);// 这里我们暂时先不验证权限信息,在下一个Shiro(授权Authorization)再实现return shiroFilterFactory;}@Bean(name = "shiroDialect")public ShiroDialect shiroDialect(){return new ShiroDialect();}/*** 开启 Shiro注解 (如 @RequiresRoles,@RequiresPermissions)* 需借助 SpringAOP 扫描使用 Shiro 注解的类,并在必要时进行安排逻辑验证* 配置以下两个bean(DefaultAdvisorAutoProxyCreator和 AuthorizationAttributeSourceAdvisor)*/public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();advisorAutoProxyCreator.setProxyTargetClass(true);return advisorAutoProxyCreator;}/*** 开启 aop 注解支持*/@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;}
}

编写控制器Controller

package com.ktjiaoyu.thymeleaf.controller;import com.ktjiaoyu.thymeleaf.service.RightService;
import com.ktjiaoyu.thymeleaf.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author cuishujian* @date 2024/9/13*/
@Controller
public class IndexController {@RequestMapping("/login")public String login(){return "login";}@RequestMapping("/main")public String toMain(Model model){return "main";}@RequestMapping("/doLogin")public String doLogin(String usrName, String usrPassword, HttpServletRequest request, Model model){try {UsernamePasswordToken token = new UsernamePasswordToken(usrName,usrPassword);Subject subject = SecurityUtils.getSubject();subject.login(token);// 认证、登录// 认证(登录)成功User user = (User) subject.getPrincipal();request.getSession().setAttribute("loginUser",user);return "redirect:/main";}catch (UnknownAccountException | IncorrectCredentialsException e){model.addAttribute("msg","用户名或密码错误,登录失败!");return "login";}catch (LockedAccountException e){model.addAttribute("msg","用户被禁用,登录失败!");return "login";}catch (AuthenticationException e){model.addAttribute("msg","认证异常,登录失败!");return "login";}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解队列(Queue)的实现(纯小白进)

目录: 前言一、 什么是队列?1.1、 队列的特性1.2、 队列的图解 二、 队列的详细实现2.1、 队列不同的实现方式2.2、 队列结构体2.3、 队列的初始化2.4、 入队列2.5、 出队列2.6、 获取对头元素2.7、 获取队尾元素2.8、 队列的判空2.9、 队列有效的元素个数2.10、 队…

Kind部署的K8s证书过期后的解决方案

证书通常有效期为1年,一年后服务将不可用解决方案就是更新证书 1. 找到 Kind 集群的控制平面容器名称,容器名称不一定是这个 docker ps --filter "namekind-control-plane"2. 进入 Kind 控制平面的容器: docker exec -it kind-control-plane…

flutter TextField限制中文,ios自带中文输入法变英文输入问题解决

由于业务需求,要限制TextField只能输入中文,但是测试在iOS测试机发现自带中文输入法会变英文输入问题,安卓没有问题,并且只有iOS自带输入法有问题,搜狗等输入法没问题。我们目前使用flutter2.5.3版本,高版本…

洛谷入门刷题Day5(想刷水题结果被水题刷了)

P1304 哥德巴赫猜想 题目描述 输入一个偶数 N N N,验证 4 ∼ N 4\sim N 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 2 2 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10 10…

论文笔记:Ontology-enhanced Prompt-tuning for Few-shot Learning

论文来源:WWW 2022 论文地址:https://arxiv.org/pdf/2201.11332.pdfhttps://arxiv.org/pdf/2201.11332.pdf 论文代码:暂未公开 笔记仅供参考,撰写不易,请勿恶意转载抄袭! Abstract 小样本学习旨在基于…

Linux——传输层协议

目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…

数据挖掘学习笔记:朴素贝叶斯 | Python复现

数据挖掘学习笔记:朴素贝叶斯 机器学习系列(四):朴素贝叶斯(华强买瓜版) - yyxy的文章 - 知乎 十分钟,让你再也忘不掉贝叶斯分类 - VoidHaruhi的文章 - 知乎 《机器学习》(西瓜书&am…

基于Arduino的简易收音机

DIY FM收音机:使用Arduino和Si4703模块打造 引言 在本项目中,我们将使用Arduino Nano和Si4703 FM调谐模块来构建一个功能完备的FM收音机接收器。这个易于跟随的指南非常适合想要深入无线电频率和无线通信世界的业余爱好者和电子爱好者。 Si4703模块是…

说下SSL/TLS四次握手过程?

参考自:SSL/TLS四次握手过程是怎么样的?HTTPS、SSL、TLS三者之间的联系和区别 一.SSL/TLS 简介 SSL(Secure Socket Layer 安全套接层)是基于 HTTPS 下的一个协议加密层,用于解决 HTTP 在传输数据时使用明文而导致的不安全问题。 SSL 是 HT…

cuda编程模型

host和device: host:即CPU,CPU所关联的内存就叫host memorydevice:即GPU,GPU内的内存就叫device memory运行CUDA程序主要有三步:1)host-to-device transfer:将数据从host memory拷到…

Qt(简介)

1. Qt简介 Qt是一个基于C的图形用户界面(GUI)框架,可以开发可视化人机交互程序,但是这并不是Qt的全部。Qt除了可以绘制漂亮的界面外,还包含很多其他的功能:多线程、数据库、图像处理、音视频处理、网络通信…

Python画笔案例-085 绘制 3D效果文字

1、绘制3D效果文字 通过 python 的turtle 库绘制 3D效果文字,如下图: 2、实现代码 绘制 3D效果文字,以下为实现代码: """3D效果文字.py """ import turtle# 给Turtle类增加addx和addy方法 turtle.Turtle.addx = lambda self,dx

OpenUAV:首个专为现实无人机视觉语言导航设计的大规模轨迹数据集,由大约 12k 个轨迹组成,涵盖了多种环境和复杂的飞行动态。

2024-10-10,由北京航空航天大学人工智能研究所、香港中文大学MMLab以及感知与交互智能中心共同创建了OpenUAV数据集,首个专为现实无人机(UAV)视觉语言导航(VLN)任务设计的大型轨迹数据集,该数据…

2023年云南省职业院校技能大赛(网络建设与运维赛项)

2023年云南省职业院校技能大赛 “网络搭建与应用”赛项样题 2023年8月 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络理论测试(100分) 第二部分:网络建设与调试&…

精准管理知识资产:十大内部知识库工具全解析

在当今竞争激烈的市场环境中,知识资产已成为企业核心竞争力的重要组成部分。为了更好地管理和利用这些宝贵的知识资源,选择合适的内部知识库工具至关重要。本文将为您介绍十款高效、实用的内部知识库工具,帮助您实现知识资产的精准管理。 1.…

SldWorks问题 2. 矩阵相关接口使用上的失误

问题 在计算三维点在图纸(DrawingDoc)中的位置时,就是算不对,明明就4、5行代码,怎么看都是很“哇塞”的,毫无问题的。 但结果就是不对。 那就调试一下吧,调试后发现生成的矩阵很不对劲&#…

架构设计笔记-15-面向服务架构设计理论与实践

目录 知识要点 案例分析 1.微服务架构 2.微服务 3.微服务架构 4.SOA与微服务 5.基于微服务架构的系统/传统单体式系统 论文 1.论微服务架构及其应用 知识要点 服务组件体系结构(Service Component Architecture,SCA)是面向服务体系…

重头开始嵌入式第四十九天(Linux内核驱动 内核编译 向内核添加新文件)

目录 内核编译: 什么是uImage? 一、产生背景 二、主要特点 三、使用方式 uImage与zImage与Image的区别? 向内核添加新驱动文件: 内核编译: 什么是uImage? uImage 是一种用于嵌入式系统的 Linux 内核…

【网络安全】IDOR与JWT令牌破解相结合,实现编辑、查看和删除数万帐户

未经许可,不得转载。 文章目录 前言漏洞1漏洞2修复建议在今年4月17日,笔者发过一篇关于 JWT 的文章,未学习过或稍有遗忘的朋友可以点击跳转:【网络安全 | 密码学】JWT基础知识及攻击方式详析 现分享一篇与 JWT 有关的漏洞挖掘案例。 前言 我在某公共漏洞奖励计划的应用程…

windows安装deepspeed setup.py 207行找不到文件

一直报莫名奇妙的错误,查了半天也没查到 去看了一下源码,需要安装git,我没有安装 git命令获得信息也没啥用 直接注释掉 成功运行