Shiro安全认证技术实践

为Java后端项目添加Shiro进行身份验证,授权操作:

步骤1.引入相关依赖:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.9.1</version> <!-- 确保使用最新版本 -->
</dependency>

步骤2.配置shiro.ini

在resources目录下进行添加shiro.ini文件

[main]
# Realm配置
myRealm = org.apache.shiro.realm.jdbc.JdbcRealm
myRealm.dataSource = myDataSource# 使用自定义Realm
securityManager.realms = $myRealm[users]
# 用户名 = 密码, 角色
admin = secret, admin
guest = guest, guest[roles]
# 角色 = 权限
admin = *
guest = read
user = read

步骤3.配置ShiroConfig

在config目录下创建ShiroConfig.java文件

package com.cetide.oj.config;import org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.authz.ModularRealmAuthorizer;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.session.mgt.DefaultSessionManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;@Configuration
public class ShiroConfig {@Beanpublic Realm myRealm() {// 返回你自己的 Realm 实现return new MyRealm();}@Beanpublic ModularRealmAuthenticator authenticator() {ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());authenticator.setRealms(Arrays.asList(myRealm()));return authenticator;}@Beanpublic ModularRealmAuthorizer authorizer() {ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer();authorizer.setRealms(Arrays.asList(myRealm()));return authorizer;}@Beanpublic SecurityManager securityManager(DataSource dataSource) {JdbcRealm realm = new JdbcRealm();realm.setDataSource(dataSource);// 配置Realm的用户查询和角色查询realm.setPermissionsLookupEnabled(true); // 启用权限查找// 你可以在这里设置自定义的SQL查询以获取用户和角色信息DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(realm);return securityManager;}@Beanpublic DefaultSessionManager sessionManager() {DefaultSessionManager sessionManager = new DefaultSessionManager();return sessionManager;}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();filterFactoryBean.setSecurityManager(securityManager);// 配置访问路径Map<String, String> filterChainDefinitionMap = new HashMap<>();filterChainDefinitionMap.put("/admin/**", "roles[admin]");filterChainDefinitionMap.put("/guest/**", "roles[guest]");filterChainDefinitionMap.put("/**", "anon"); // 允许匿名访问filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return filterFactoryBean;}
}

步骤4.配置自定义MyRealm

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;public class MyRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();if ("admin".equals(username)) {info.addRole("admin");info.addStringPermission("*"); // admin有所有权限} else if ("guest".equals(username)) {info.addRole("guest");info.addStringPermission("read"); // guest仅有读取权限}return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username = (String) token.getPrincipal();String password = new String((char[]) token.getCredentials());// 模拟数据库查询if ("admin".equals(username) && "123456".equals(password)) {return new SimpleAuthenticationInfo(username, password, getName());} else {throw new UnknownAccountException("用户名或密码错误");}}
}

步骤5.引入到Controller中

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HomeController {@PostMapping("/login")public String login(String username, String password) {Subject currentUser = SecurityUtils.getSubject();if (!currentUser.isAuthenticated()) {// 创建一个用户认证的tokenUsernamePasswordToken token = new UsernamePasswordToken(username, password);try {// 执行登录操作currentUser.login(token);if (currentUser.hasRole("admin")) {return "admin"; // 返回管理员视图}return "403"; // 无权限视图} catch (Exception e) {e.printStackTrace();return "loginError"; // 登录失败,返回错误视图}}return "redirect:/"; // 已经登录,重定向到主页}@RequestMapping("/logout")public String logout() {Subject currentUser = SecurityUtils.getSubject();if (currentUser.isAuthenticated()) {currentUser.logout(); // 执行注销}return "redirect:/"; // 注销后重定向到主页}@GetMapping("/")public String home() {return "index"; // 返回主页视图}@GetMapping("/admin")public String admin() {Subject currentUser = SecurityUtils.getSubject();if (currentUser.hasRole("admin")) {return "admin"; // 返回管理员视图}return "403"; // 无权限视图}@GetMapping("/guest")public String guest() {return "guest"; // 返回访客视图}
}

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

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

相关文章

【论文速读】| RED QUEEN: 保护大语言模型免受隐蔽多轮越狱攻击

基本信息 原文标题&#xff1a;RED QUEEN: Safeguarding Large Language Models against Concealed Multi-Turn Jailbreaking 原文作者&#xff1a;Yifan Jiang, Kriti Aggarwal, Tanmay Laud, Kashif Munir, Jay Pujara, Subhabrata Mukherjee 作者单位&#xff1a;Hippocr…

怎么做才能降低APP用户的卸载率?

常年困扰 App 开发者的始终是一个问题&#xff1a;怎么做才能降低用户卸载率呢&#xff1f; 不要慌&#xff0c;今天这篇文章里&#xff0c;你就会找到解决方案啦。首先请记住&#xff1a; 每个 App 都是有自己独立个性的&#xff0c;所以没有一个通用的公式能让大家套用。 还…

【Window】无法登录G**gle解决方案

以下是PowerShell命令解决方案&#xff0c;按顺序执行&#xff1a; # 1. 刷新DNS缓存 ipconfig /flushdns# 2. 设置Go**le DNS netsh interface ipv4 set dns name"以太网" static 8.8.8.8 netsh interface ipv4 add dns name"以太网" 8.8.4.4 index2# 3.…

Transformer模型——tokenize分词

tokenize的目标是输出的文本流&#xff0c;切分成一个个子串&#xff0c;每个子串相对有完整的语义&#xff0c;便于学习Embedding表达和后续模型的使用。 tokenize有三种粒度&#xff1a;word / subword / char word&#xff1a;词。对于英文等语言来说&#xff0c;存在着天然…

自动驾驶上市潮中,会诞生下一个“英伟达”吗?

站上科技创新潮头的企业总是备受资本青睐。20世纪开始&#xff0c;从IT到互联网&#xff0c;IBM、英特尔、微软、苹果等各大科技巨头&#xff0c;你方唱罢我登场。 近几年&#xff0c;人工智能成为资本市场新传奇故事的孕育之地。今年10月&#xff0c;英伟达市值首度突破3.5万…

【vue项目中添加告警音频提示音】

一、前提&#xff1a; 由于浏览器限制不能自动触发音频文件播放&#xff0c;所以实现此类功能时&#xff0c;需要添加触发事件&#xff0c;举例如下&#xff1a; 1、页面添加打开告警声音开关按钮 2、首次进入页面时添加交互弹窗提示&#xff1a;是否允许播放音频 以上两种方…

产品结构设计(六):结构设计全过程

参考引用 产品结构设计实例教程 1. ID 图及 PCB 堆叠分析 1.1 产品说明及相关资料 1、新产品开发指令单 2、ID 图 3、产品功能规格书 1.2 ID 图分析 ID&#xff08;Industrial Design&#xff0c;工业设计&#xff09;是以工业产品为主要对象&#xff0c;综合运用工学、…

文献阅读记录6-Toward computer-made artificial antibiotics

摘要 将合成生物学和计算生物学的概念结合起来&#xff0c;可能会产生比现有药物更不容易产生耐药性的抗生素&#xff0c;而且还能对抗耐药感染。事实上&#xff0c;计算机引导策略与大规模并行高通量实验方法相结合&#xff0c;代表了抗生素发现的新范式。耐多药微生物引起的…

Manus在虚拟现实仿真模拟中的应用案例分享

Manus虚拟现实手套作为一种高精度的人机交互设备&#xff0c;在仿真模拟领域展现出了巨大的应用潜力。通过提供实时、准确的手指动作捕捉数据&#xff0c;Manus手套为多个行业带来了前所未有的仿真体验&#xff0c;推动了技术发展和应用创新。 技术特点 1. 高精度手指跟踪 Ma…

Vim的简单使用

文章目录 Vim的使用日志前言梦的开始从说明书开始Take a bite!Learn to Read!配置文件vimtutor 一些比较实用的操作移动编辑删除、复制、粘贴与组合命令查找替换撤销重做光标跳转补全和命令浅尝一下 保存、丢弃和另存为 关于插件和其他后记关于参考资料 Vim的使用 日志 文章编…

繁星之下--

在一个宁静的小镇上&#xff0c;年轻的画家阿宁用她的画笔捕捉着四季的变换。这个小镇四季分明&#xff0c;春天的嫩芽、夏天的繁花、秋天的金黄和冬天的白雪&#xff0c;仿佛每一个季节都在向她诉说着自己的故事。阿宁常常在思考&#xff0c;如何将这些美丽的瞬间转化为永恒的…

Vue2——单页应用程序路由的使用

一.单页应用程序与多页应用程序之间的比较 二.单页的应用场景 系统类网站 / 内部网站 / 文档类网站 / 移动端网站 三.路由的介绍 1. 什么是路由 路由是一种映射关系 2. Vue中的路由是什么 路径和组件的映射关系 四.VueRouter的使用 5个基础步骤&#xff08;固定&#xff09; …

Windows 下实验视频降噪算法 MeshFlow 详细教程

MeshFlow视频降噪算法 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow&#xff0c;它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field)&#xff0c;其运动矢量 (motion vectors) 仅在网格顶点 (m…

大语言模型训练与推理模型构建源码解读(huggingface)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、llama训练模型构建源码解读1、模型构建代码(自己搭建)2、训练模型3、模型调用方法4、训练模型init方法(class LlamaForCausalLM(LlamaPreTrainedModel))5、训练模型forward方法(class Llam…

用Python脚本执行安卓打包任务

这个样例是基于windows系统写的python打包安卓的脚本&#xff1a; 一、配置AndroidStudio下的打包任务 1.在Android项目根目录下的build.gradle文件配置生成Release包的任务&#xff1a; task cleanAll(type: Delete) {delete rootProject.buildDirrootProject.subprojects.e…

专题十七_BFS_BFS解决 FloodFill 算法_BFS 解决最短路问题_多源 BFS_BFS 解决拓扑排序

目录 BFS 一、BFS解决 FloodFill 算法 1. 图像渲染&#xff08;medium&#xff09; 解析&#xff1a; 细节问题&#xff1a; 总结&#xff1a; 2. 岛屿数量&#xff08;medium&#xff09; 解析&#xff1a; DFS&#xff1a; BFS&#xff1a; 总结&#xff1a; 3. …

NVR小程序接入平台/设备EasyNVR多个NVR同时管理视频监控新选择

在数字化转型的浪潮中&#xff0c;视频监控作为安防领域的核心组成部分&#xff0c;正经历着前所未有的技术革新。随着技术的不断进步和应用场景的不断拓展&#xff0c;视频监控系统的兼容性、稳定性以及安全性成为了用户关注的焦点。NVR小程序接入平台/设备EasyNVR&#xff0c…

Vite学习之环境变量

环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量&#xff0c;这些变量在构建时会被静态地替换掉。这里有一些在所有情况下都可以使用的5个内建变量&#xff1a; import.meta.env.MODE: {string} 应用运行的模式。import.meta.env.BASE_URL: {string} 部署应用…

leetcode71:简化路径

给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下&#xff1a; 一个点 . 表示当前目录本身。此外&#xff0c;两个点 ..…

(自用)机器学习python代码相关笔记

一些自存的机器学习函数和详细方法记录&#xff0c;欢迎指错。 前言&#xff1a;读取数据方法 import pandas as pd import pandas as pddf pd.read_csv(数据集.csv, header0) # header是从哪一行开始读起&#xff0c;一般是0&#xff0c;也可以取infer 一、数据处理&#…