SpringBoot+Shiro权限管理

完善之前的博客里的项目,本博客主要讲述Shiro的权限管理模块

 代码实例

        引入依赖

<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-spring-boot-starter</artifactId>  <version>1.7.0</version>  
</dependency>

        配置Shiro 

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.spring.web.config.DefaultShiroFilterChainDefinition;  
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;  
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  import javax.servlet.Filter;  
import java.util.HashMap;  
import java.util.Map;  @Configuration  
public class ShiroConfig {  @Bean  public SecurityManager securityManager(MyRealm myRealm) {  DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();  securityManager.setRealm(myRealm);  return securityManager;  }  @Bean  public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {  ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();  shiroFilterFactoryBean.setSecurityManager(securityManager);  shiroFilterFactoryBean.setLoginUrl("/login");  shiroFilterFactoryBean.setUnauthorizedUrl("/403");  Map<String, Filter> filters = new HashMap<>();  // 可以添加自定义的过滤器  shiroFilterFactoryBean.setFilters(filters);  Map<String, String> filterChainDefinitionMap = new HashMap<>();  filterChainDefinitionMap.put("/login", "anon");  filterChainDefinitionMap.put("/**", "authc");  ShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();  chainDefinition.setChainDefinitionMap(filterChainDefinitionMap);  shiroFilterFactoryBean.setFilterChainDefinitionMap(chainDefinition.getChainDefinitionMap());  return shiroFilterFactoryBean;  }  @Bean  public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {  AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();  advisor.setSecurityManager(securityManager);  return advisor;  }  
}

        自定义Realm 

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 org.springframework.beans.factory.annotation.Autowired;  public class MyRealm extends AuthorizingRealm {  @Autowired  private UserService userService; // 假设有一个UserService用于查询用户信息  @Override  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {  String username = (String) principalCollection.getPrimaryPrincipal();  // 查询用户权限和角色  SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();  // 假设从数据库中查询到的角色和权限  authorizationInfo.addRole("role1");  authorizationInfo.addStringPermission("user:delete");  return authorizationInfo;  }  @Override  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {  UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;  String username = token.getUsername();  // 查询用户信息  User user = userService.findByUsername(username);  if (user == null) {  throw new UnknownAccountException("用户不存在");  }  // 返回验证信息  return new SimpleAuthenticationInfo(username, user.getPassword(), getName());  }  
}

        控制层

package com.bdqn.controller;import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bdqn.pojo.Right;
import com.bdqn.pojo.Role;
import com.bdqn.service.RightService;
import com.bdqn.service.RoleService;
import jakarta.annotation.Resource;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;import java.util.*;@Controller
@RequestMapping("/role")
public class RoleController {@Resourceprivate RoleService roleService;@Resourceprivate RightService rightService;/*** 角色列表*/@RequiresPermissions("L0602")@RequestMapping("/list")public String list(Model model, String roleName, Long pageIndex) {// 当前要查询的页码,如果是null则设置为默认查第1页pageIndex = pageIndex == null ? 1 : pageIndex;// 分页查询用户列表Page page = new Page(pageIndex, 5L);Page<Role> rolePager = roleService.findPage(roleName, page);// 设置数据到作用域model.addAttribute("roleName", roleName); // 数据回显model.addAttribute("rolePager", rolePager);// 跳转页面return "role/list";}/*** 去添加页*/@RequiresPermissions("L060201")@GetMapping("/add")public String toAdd(Model model) {// 查找所有权限,用于指派权限List<Right> rights = rightService.findAll();// 设置数据到作用域model.addAttribute("rights", rights);// 跳转页面return "role/add";}/*** 检查用户名是否可用({"result":"true"} 表示已存在,不可用)*/@ResponseBody // REST风格,直接将数据写入响应流(对应Ajax请求)@GetMapping("/check")public String checkRoleName(String roleName, Long roleId) {JSONObject json = new JSONObject();if (roleName == null) {json.put("result", "error");return json.toJSONString();}// 判断角色名称是否可用(排除某个ID)Role role = roleService.getByRoleNameExceptRoleId(roleName, roleId);json.put("result", String.valueOf(role != null));return json.toJSONString();}/*** 跳转到修改页*/@RequiresPermissions("L060204")@GetMapping("/edit")public String toEdit(Model model, Long roleId) {// 查找所有权限,用于指派权限List<Right> rights = rightService.findAll();// 根据ID获取角色信息Role role = roleService.getById(roleId);// 通过角色ID获取对应的权限集合Set<Right> roleRights = rightService.findRightByRoleId(roleId);role.setRights(roleRights); // 权限角色拥有的权限集合// 将数据设置到作用域model.addAttribute("rights", rights);model.addAttribute("role", role);// 跳转页面return "role/edit";}/*** 保存角色信息(权限映射关系先删除再添加)*/@RequiresPermissions("L060202")@PostMapping("/save")public String save(Role role, String[] rightCodes) {System.out.println(role);// 使用Lambda表达式打印数组信息Arrays.stream(rightCodes).forEach(code -> System.out.print(code + ' '));System.out.println();// 保存角色及对应的权限(兼容添加和修改)roleService.saveRoleAndRight(role, rightCodes);// 重定向到列表页面return "redirect:/role/list";}/*** 删除角色*/@RequiresPermissions("L060203")@ResponseBody@PostMapping("/del/{roleId}")public Map<String, Object> del(@PathVariable("roleId") Long roleId) {Map<String, Object> map = new HashMap<>();boolean result = false;map.put("result", String.valueOf(result));return map;}}

最后启动项目...

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

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

相关文章

【C++】布隆过滤器的概念与特点解析

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 00.引入 01.布隆过滤器的概念 特点1&#xff1a;极低的内存消耗 特点2&#xff1a;快速查询 特点3&#xff1a;假阳…

深入解析:云计算与虚拟化技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 深入解析&#xff1a;云计算与虚拟化技术 文章目录 云计算概述定义服务模型部署模型 虚拟化技术定义类型关键技术 云计算与虚…

React Router v6 中用于在导航到指定路由之前使用loader预加载数据

在 React Router v6 中&#xff0c;loader 函数用于在导航到某个路由之前预加载数据。这是非常有用的功能&#xff0c;特别是在需要从服务器获取数据并将其传递给组件的情况下。loader 函数可以帮助你提前获取数据&#xff0c;从而提高用户体验和应用性能。 loader 函数的作用…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

cangjie仓颉编程语言学习Note-2.标准库学习

cangjie仓颉编程语言学习Note-2.标准库学习 当前仓颉标准库提供了几乎涵盖常见开发所使用的常见库&#xff0c;这一点很赞&#xff01; 详细模块如下&#xff1a; std: 意指标准库&#xff0c;标准库是指在编程语言中预先定义的一组函数、类、结构体等&#xff0c;旨在提供常…

时间序列预测(十八)——实现配置管理和扩展命令行参数解析器

如图&#xff0c;这是一个main,py文件&#xff0c;在此代码中&#xff0c;最开始定义了许多模型参数&#xff0c;为了使项目更加灵活和可扩展&#xff0c;便于根据不同的需求调整参数和配置&#xff0c;可以根据实际需要扩展参数和配置项。 下面是如何实现配置管理和扩展命令行…

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索&#xff1a;超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker&#xff0c;通过dockers镜像安装很方便&#xff0c;且很快&#xff1b;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像&#xff1b; docker search awvs…

QT for android 问题总结(QT 5.15.2)

1.配置好的sdk&#xff0c;显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 &#xff0c;下载一个低版本的latest &#xff0c;替换掉之前latest中的文件。即可&#xff0c;latest 路径如…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

软件测试基础九 (python基础)

python基础 1. 注释 1.1. 注释的作⽤ 使⽤⾃⼰熟悉的语⾔&#xff0c;在程序中对某些代码进⾏标注说明&#xff0c;增强程序的可读性。 1.2. 单⾏注释 以# 开头&#xff0c;# 右边的所有东⻄都被当做说明⽂字&#xff0c;⽽不是真正要执⾏的程序&#xff0c;只起到辅助说明…

使用Kafka构建大规模消息传递系统

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Kafka构建大规模消息传递系统 引言 Kafka 简介 安装 Kafka 创建主题 生产者 消费者 高级特性 分区 持久化 消费者组 消息确认…

AI 大模型重塑软件开发流程的未来

目录 前言1. AI 大模型简介2. AI 大模型在软件开发中的应用场景2.1 代码自动生成2.2 智能调试与错误检测2.3 软件测试的自动化2.4 文档生成与代码注释 3. AI 大模型对软件开发的优势3.1 提高开发效率3.2 提升代码质量与一致性3.3 降低学习成本 4. AI 大模型在软件开发中面临的挑…

docker镜像获取不到的问题处理

总结 国内源的限制&#xff0c;很多镜像pull失败。 我目前使用的感觉最合理的方式就是去云平台厂商买一个香港的云主机。使用弹性模式&#xff0c;就是一小时几毛钱的那种。 然后pull镜像&#xff0c;pull成功后&#xff0c;save到本地&#xff0c;然后用xshell下载下来。因为…

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…

求平面连接线段组成的所有最小闭合区间

这个功能确实非常实用&#xff0c;我在过去开发地面分区编辑器时就曾应用过这一算法。最近&#xff0c;在新产品的开发中再次遇到了类似的需求。尽管之前已经实现过&#xff0c;但由于长时间未接触&#xff0c;对算法的具体细节有所遗忘&#xff0c;导致重新编写时耗费了不少时…

【P2-7】ESP8266 WIFI模块在AP模式下实现UDP与电脑/手机网络助手通信——UDP数据透传

前言:完成ESP8266 WIFI模块在AP模式下实现UDP与电脑/手机网络助手通信——实现UDP数据透传 AP模式,通俗来说模块可以发出一个WIFI热点提供给电脑/手机连接。 UDP协议,是传输层协议,UDP没有服务器和客户端的说法。 演示视频: ESP8266 WIFI模块在AP模式下实现UDP与电脑/手机…

金箍棒变化-第15届蓝桥杯国赛Scratch初/中级组真题第1题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第193讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

SpringBoot+Shirp的权限管理

目录 怎么实现动态菜单 1.html页面 2.获取动态菜单 Shiro权限刷新 1. 配置Shiro 2. 创建权限刷新服务 3. 调用权限刷新服务 注意事项 如何更新ShiroFilter初始权限 怎么实现动态菜单 1.html页面 <ul class"nav side-menu"><!--第一重循环&#xf…

hunyuan-DiT模型部署指南

一、介绍 Hunyuan-DiT是由腾讯混元推出的扩散模型&#xff0c;支持中文和英文双语输入&#xff0c;其他开源模型相比&#xff0c;Hunyuan-DiT 在中文到图像生成方面树立了新的水平。 二、部署流程 环境要求&#xff1a; 所需的最小 GPU 内存为 11GB&#xff0c; 建议使用具…