Shiro之授权

news2024/11/16 23:56:07

授权

1、角色认证

在controller层创建接口

使用shiro中的注解@RequiresRoles指定能访问的角色名称

/**
 * 登录认证角色
 */
@RequiresRoles("admin")
@GetMapping("/userLoginRoles")
@ResponseBody
public String userLoginRoles(){
    System.out.println("登录认证验证角色");
    return "管理员角色验证成功";
}

在自定义的MyRealm自定义授权方法

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    //1、查询当前用户的身份信息
    String principal = principalCollection.getPrimaryPrincipal().toString();
    List<String> roles = userService.getUserRoleInfo(principal);


    //2、创建对象,封装当前登录用户的角色、权限信息
    SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();


    //3、存储角色
    info.addRoles(roles);
    System.out.println(roles);
    return info;
}

其中的service层

@Override
public List<String> getUserRoleInfo(String principal) {

    return userMapper.getUserRoleInfoMapper(principal);
}

dao层

@Select("select  name from role  where id in( select id from role_user where uid=(select id from user where name=#{principal}))")
List<String> getUserRoleInfoMapper(@Param("principal")String principal);

数据库表

role角色表

在这里插入图片描述

/*
 Navicat Premium Data Transfer

 Source Server         : 本机
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : shirodb

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

 Date: 22/12/2022 10:37:15
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role`  (
  `id` bigint NOT NULL COMMENT '编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色名',
  `desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
  `realname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色显示名',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1, 'admin', '所有权限', '管理员');
INSERT INTO `role` VALUES (2, 'userMag', '用户管理权限', '用户管理');

SET FOREIGN_KEY_CHECKS = 1;

角色用户关系表

在这里插入图片描述

/*
 Navicat Premium Data Transfer

 Source Server         : 本机
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : shirodb

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

 Date: 22/12/2022 10:37:27
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role_user
-- ----------------------------
DROP TABLE IF EXISTS `role_user`;
CREATE TABLE `role_user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `uid` int NULL DEFAULT NULL,
  `rid` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of role_user
-- ----------------------------
INSERT INTO `role_user` VALUES (1, 1, 1);
INSERT INTO `role_user` VALUES (2, 1, 2);
INSERT INTO `role_user` VALUES (3, 2, 2);

SET FOREIGN_KEY_CHECKS = 1;

2、权限认证

创建权限表(permission)

在这里插入图片描述

sql语句

/*
 Navicat Premium Data Transfer

 Source Server         : 本机
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : shirodb

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

 Date: 22/12/2022 11:09:55
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for permission
-- ----------------------------
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of permission
-- ----------------------------
INSERT INTO `permission` VALUES (1, '删除用户', 'user:delete', '删除用户');
INSERT INTO `permission` VALUES (2, '新增用户', 'user:add', '新增用户');
INSERT INTO `permission` VALUES (3, '修改用户', 'user:endit', '修改用户');

SET FOREIGN_KEY_CHECKS = 1;

创建角色权限表

在这里插入图片描述

/*
 Navicat Premium Data Transfer

 Source Server         : 本机
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : shirodb

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

 Date: 22/12/2022 11:10:09
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role_ps
-- ----------------------------
DROP TABLE IF EXISTS `role_ps`;
CREATE TABLE `role_ps`  (
  `id` int NOT NULL,
  `rid` int NULL DEFAULT NULL,
  `pid` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of role_ps
-- ----------------------------
INSERT INTO `role_ps` VALUES (1, 1, 1);
INSERT INTO `role_ps` VALUES (2, 1, 2);
INSERT INTO `role_ps` VALUES (3, 1, 3);

SET FOREIGN_KEY_CHECKS = 1;

编写dao层

根据传来的角色名称查询对应的权限

    @Select({"<script>"," SELECT info FROM permission where id in (select pid from role_ps where rid in (select id from role where name in <foreach collection='roles' item='name' open='(' separator=',' close=')' >#{name}</foreach> ))",
            "</script>"
    })
    List<String> getUserPermissionInfo(@Param("roles") List<String> roles);

编写service层

    @Override
    public List<String> getUserPermissionInfo(List<String> roles) {


        return userMapper.getUserPermissionInfo(roles);
    }

在自定义realm中

自定义授权方法中,添加授权信息,在步骤2.5

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    //1、查询当前用户的身份信息
    String principal = principalCollection.getPrimaryPrincipal().toString();
    List<String> roles = userService.getUserRoleInfo(principal);


    //2、创建对象,封装当前登录用户的角色、权限信息
    SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();

    //2.5获取用户的权限信息
    List<String> permissions = userService.getUserPermissionInfo(roles);


    //3、存储角色
    info.addRoles(roles);
    info.addStringPermissions(permissions);
    System.out.println(roles);
    return info;
}

编写测试接口,通过@RequiresPermissions(“user:delete”)指定授权信息

/**
 * 登录认证权限
 */
@RequiresPermissions("user:delete")
@GetMapping("userPermissions")
@ResponseBody
public String userPermissions(){
    System.out.println("登录认证验证权限");
    return "user:delete权限验证成功";
}

前端页面

<a href="/myController/userPermissions">验证权限</a>

3、配置异常捕获

当用户访问无对应的权限,会直接抛出对应的异常,我们需要定义全局的异常捕获

例如:

@ControllerAdvice
public class PermisiionException {
    @ResponseBody
    @ExceptionHandler(UnauthorizedException.class)
    public String unauthorizedException(Exception e){
        return "无权限";

    }

    @ResponseBody
    @ExceptionHandler(AuthorizationException.class)
    public String unAuthorization(Exception e){
        return "权限认证失败";

    }

}

4、前端页面授权验证

在页面中所见即所得,当有哪些权限就展示对应的权限

这里使用thymeleaf来渲染前端页面

1、引入依赖

<!--        配置Thymeleaf与Shiro的整合依赖-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>

        </dependency>

2、在ShiroConfig中配置

@Bean(name = "shiroDialect")
public ShiroDialect shiroDialect(){
    return new ShiroDialect();
}

3、添加坐标

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="Thymeleaf"

      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">

4、测试

<a shiro:hasRole="admin" href="">管理员</a>
<a shiro:hasPermission="user:delete" href="">user:delete权限</a>

标签说明:

shiro:guest验证当前用户是否为“访客”,即未认证(包含未记住)的用户
shiro:user认证通过或已记住的用户
shiro:authenticated已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在
shiro:notAuthenticated未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户
shiro:hasRole验证当前用户是否属于该角色
shiro:lacksRole与hasRole标签逻辑相反,当用户不属于该角色时验证通过
shiro:hasAllRoles验证当前用户是否属于以下所有角色
shiro:hasAnyRoles验证当前用户是否属于以下任意一个角色
shiro:hasPermission验证当前用户是否拥有指定权限
shiro:lacksPermissionhasPermission标签逻辑相反,当前用户没有制定权限时,验证通过
shiro:hasAllPermissions验证当前用户是否拥有以下所有权限
shiro:hasAnyPermissions验证当前用户是否拥有以下任意一个权限

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

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

相关文章

54 线程最外层异常的处理

前言 之前在 kafka 消费者客户端的一个 case 中曾经看到了这样的了一个情况 我没有配置 "group.id", 然后 kafka 客户端抛出了 InvalidGroupIdException 然后 输出的日志信息 除了类型, 其他 什么都没有, 主要是 么有堆栈信息 这里 来大致看一下 这个问题, 以及…

WooCommerce Product Feed指南 – Google Shopping和Facebook[2022]

在过去十年中&#xff0c;在线购物一直在增加。全球超过 85% 的人更喜欢网上购物而不是光顾实体店。 许多 WooCommerce 商店都做得非常好&#xff0c;销售额是大约几年前的三倍。 您是否知道您也可以立即轻松地将商店销售额翻三倍&#xff1f; 秘诀是什么&#xff1f; 好吧&…

【网络安全】浅识 SQL 注入

前言 SQL 注入&#xff08;SQL Injection&#xff09;是发生在 Web 程序中数据库层的安全漏洞&#xff0c;是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理&#xff0c;导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外…

AcrGIS Pro一键出图

简介 日常工作中我们经常遇到批量出图的场景,比如对某个县下的各个乡镇分别按照其行政区范围出图、对某个流域/河流按照一定方向纵横的网格排布顺序出图等等要求,ArcGIS Pro对于上述需求提供了一个良好的解决方案——地图系列! 那么应该如何创建一个地图系列呢?ArcGIS Pro…

我不是浮躁,只是迷茫,北大毕业转行学编程

北大毕业的我选择去学习编程了&#xff01;&#xff01;&#xff01; 没有希望的地方&#xff0c;就没有奋斗。于千万人之中遇见它&#xff0c;于千万年之中&#xff0c;时间的无涯的荒野里&#xff0c;没有早一步&#xff0c;也没有晚一步&#xff0c;刚巧赶上了&#xff0c;那…

9_SpringMVC_作用域传参

PageContext对象 作用域范围:当前jsp页面内有效 request对象 作用域范围:一次请求内。 作用: 解决了一次请求内的资源的数据共享问题 session对象 作用域范围:一次会话内有效。 说明:浏览器不关闭,并且后台的session不失效&#xff0c;在任意请求中都可以获取到同一个se…

RV1126笔记十:RTMP单路推流

若该文为原创文章,转载请注明原文出处 一、介绍 使用ffmpeg把RV1126采集到的视频和音频以RTMP方式推流到服务器,并播放。 视频为h264格式,音频为AAC格式,利用的是RV1126硬件编码,缩短时间,在局域网内测试,实现200毫秒内实时播放预览。 二、流程图 说明: RTMP推流…

Spring MVC【返回数据与请求转发和重定向】

Spring MVC【返回数据与请求转发和重定向】&#x1f34e;一. 返回数据&#x1f352;1.1 返回静态页面&#x1f352;1.2 返回一个非静态页面&#x1f352;1.3 返回text/html类型页面&#x1f352;1.4 返回JSON对象&#x1f352;1.5 实现计算器功能&#x1f352;1.6 使用ajax方式…

RV1126笔记十一:RTMP多路推流

若该文为原创文章,转载请注明原文出处。 一、介绍 在前面,已经了解了单路推流的方式了,也成功的推流和接收到RTMP流,我们把单路扩展成多路,实际方法是和单路相同的,只是多增加了参数和线程数,把ffmpeg参数多复制几路,推流线程多开几个,那就实际了多路推的方式了,具…

视图便捷类(QListWidget,QTableWidget,QTreeWidget)

常见的视图便捷类&#xff1a; QListWidget 列表QTableWidget 表格QTreeWidget 树列表便捷类&#xff1a;QListWidget &#xff08;继承自QListView&#xff09; 构造函数&#xff1a; 常用函数: addItem()添加项目addItems()添加多个项目count()项目的数量currentItem()…

微内核、宏内核、内核模块、printk

文章目录一、微内核和宏内核二、内核模块三、内核模块code四、Makefile注意注&#xff1a;&#xff0c;?, : 区别五、prink查看prink打印优先级修改printk的打印优先级六、内核模块参数module_param与module_param_array宏定义的使用七、内核符号表--全局共享函数接口与变量1.…

2022年最新中国科学院期刊分区表变化 | 生物类、医学类

fenqu❝早上刷到了新发布的《2022年中国科学院文献情报中心期刊分区表》&#xff08;https://mp.weixin.qq.com/s/QVfwnGPCjvOaLtBvGM184g&#xff09;&#xff0c;今天利用有限的非卧床时间浅爬了一下生物和医学大类2022和2021年的数据&#xff0c;做个简单的对比。&#xff0…

学习记录-mybatis+vue+elementUi实现批量删除

老规矩&#xff0c;还是从后端到前端还是分为四步骤 步骤一 ①写SQL语句 mapper接口代码&#xff1a; /*** 批量删除* param ids*/void deleteByIds(Param("ids") int[] ids);实现语句&#xff1a; <delete id"deleteByIds">deletefrom tb_brandwh…

本周推荐 | 设计模式在淘宝营销价格体系的实践

推荐语&#xff1a;本文详细描述责任链、中介者、适配器等多种设计模式在淘宝营销价格服务中的应用&#xff0c;从而实现了一套可扩展性的架构&#xff0c;应对灵活多变营销价格需求。——大淘宝技术研发工程师 小枫每年淘宝都有双11、双12等大促&#xff0c;我们价格服务小组的…

【车载开发系列】UDS诊断---常见的ISO标准集合

【车载开发系列】UDS诊断—常见的ISO标准集合 常见的ISO标准集合【车载开发系列】UDS诊断---常见的ISO标准集合一.前言二.基于CAN总线ISO1&#xff09;ISO118982&#xff09;ISO115193&#xff09;ISO15765三.UDS诊断1&#xff09;ISO142292&#xff09;ISO14229系列规范四.CAN…

我国余热发电行业现状:政策及企业积极性双管齐下 市场发展潜力大

根据观研报告网发布的《中国余热发电行业现状深度研究与发展前景预测报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;余热发电是指利用生产过程中多余的热能转换为电能的技术。余热发电技术可以回收利用如水泥、玻璃、钢铁、冶金等行业的余热资源&#xff0c;将余热…

深入浅出synchronized关键字

前言 无论在日常工作还是面试过程中&#xff0c;synchronized关键字作为并发场景下的操作&#xff0c;是一定要掌握的&#xff0c;本文从synchronized的使用方式、原理及优化三个方面&#xff0c;对synchronized关键字作一个系统化的说明。 使用方式 synchronized主要有三种…

Apache DolphinScheduler 发布 3.1.2 版本,Python API 实现优化

点亮 ⭐️ Star 照亮开源之路https://github.com/apache/dolphinscheduler近日&#xff0c;Apache DolphinScheduler 发布了 3.1.2 版本。此版本主要基于 3.1.1 版本进行了 6 处 Python API 优化&#xff0c;19 处 Bug 修复&#xff0c;并更新了 4 个文档。其中较为重要的 Bug…

HashMap1.7和1.8源码解析

1.HashMap &#xff08;1&#xff09;数据结构 在JDK1.7中&#xff0c;HashMap中的数据结构是数组单链表的组合&#xff1b;在JDK1.8中的HashMap存储结构是由数组、链表、红黑树这三种数据结构形成。 &#xff08;2&#xff09;JDK1.7中HashMap源码分析 &#xff08;2.1&am…

Portal门户常见宕机或性能低问题分析与七大解决之道

不论使用什么产品构建门户&#xff0c;只要是基于Java技术的&#xff0c;就很容易宕机或出现性能低的问题。因为Portal产品比较复杂&#xff0c;且集成的数据特别多&#xff0c;架构特别复杂&#xff0c;涉及到的数据通信特别多。宕机或性能低也通常是用户较为头疼的问题。经常…