shiro入门demo(二)授权

在前面认证的基础上,认证通过后一般还有个授权的操作。授权根据业务需求有两种维度,基于角色的授权和基于资源的授权。

一、授权-基于角色授权:

  shiro中授权实现方式:有三种

1、编程式
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
	//有权限
} else {
	//无权限
}

编程式又有两种方式:
 (1)hasRole、hasAllRoles 返回值true/false
 (2)checkRole、checkRoles 只要验证失败就报异常


2、注解式
@RequiresRoles("admin")
public void hello() {
	//有权限
}


3、标签式
JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
	<!— 有权限—>
</shiro:hasRole>
注意: Thymeleaf 中使用shiro需要额外集成!

 这里看下第一种编程式

1、配置文件mock数据实现:

  新建shiro-user-role.ini配置文件

[users]
zs=123,role1
ls=123,role2
admin=123,role1,role2

 单元测试

  /**
     * 以admin/123用户为例
     */
    @Test
    public void testRole(){
        //1、创建SecurityManagerFactory 读取ini数据源文件
        IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro-user-role.ini");
        //2、创建安全管理器SecurityManager
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //3、通过SecurityUtil获取登入用户主体subject
        Subject subject = SecurityUtils.getSubject();
        //4、创建登入令牌token
        UsernamePasswordToken token=new UsernamePasswordToken(
                "admin", "123"
        );
        //用户认证(shiro的核心功能之一)
        try {
            //异常
            //1.org.apache.shiro.authc.UnknownAccountException:账号错误异常
            //2.org.apache.shiro.authc.IncorrectCredentialsException:密码错误异常
            //3.org.apache.shiro.authz.UnauthorizedException: 授权错误异常
            subject.login(token);
            System.out.println("认证成功");
        } catch (AuthenticationException e) {
            System.out.println("认证失败");
            e.printStackTrace();
        }
        //角色验证
        try {
            //方式一:hasRole 返回值true/false
            if (subject.hasRole("role1")) {
                System.out.println("角色验证成功");
            } else {
                System.out.println("角色验证失败");
            }
            //方式二:checkRole 只要验证失败就报异常
            //subject.checkRole("role1");
            //System.out.println("角色验证成功");

            //hasRoles: 参数List集合 返回boolean数组 返回顺序与传递顺序一一对应 传普通用户,高级用户,管理员 返回false,false,true
            //hasAllRoles: 参数Collection集合 返回true/false 如果有一个角色验证失败就返回false
        } catch (Exception e) {
            System.out.println("角色验证失败");
            e.printStackTrace();
        }

        //7、安全退出
        subject.logout();
    }

输出:认证成功 角色验证成功;

密码错误,角色正确,输出:

密码正确,改成错误的角色,输出:

二、授权-基于资源授权 :

  资源权限验证有两种方式:

(1)isPermitted、isPermittedAll方式,返回值true/false
(2)checkPermission、checkPermissions方式,只要验证失败就报异常

4、Permission字符串通配符权限:

(1)规则:资源标志符:操作:对象实例id;

(2)*表示任意资源/操作/实例。

1、配置文件实现:

  新建shiro-user-role-permisson.ini配置文件:

[users]
zs=123,role1
ls=123,role2
admin=123,role1,role2,role4

[roles]
role1=system:user:add
role2=system:user:add,system:user:select
role3=system:user:add,system:user:select,system:user:update,system:user:delete
role4=system:*:*

  单元测试:在前面的基础上加上资源权限验证即可

 /**
     * 以admin/123用户为例
     */
    @Test
    public void testRole(){
        //1、创建SecurityManagerFactory 读取ini数据源文件
        IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro-user-role-permisson.ini");
        //2、创建安全管理器SecurityManager
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //3、通过SecurityUtil获取登入用户主体subject
        Subject subject = SecurityUtils.getSubject();
        //4、创建登入令牌token
        UsernamePasswordToken token=new UsernamePasswordToken(
                "admin", "123"
        );
        //用户认证(shiro的核心功能之一)
        try {
            //异常
            //1.org.apache.shiro.authc.UnknownAccountException:账号错误异常
            //2.org.apache.shiro.authc.IncorrectCredentialsException:密码错误异常
            //3.org.apache.shiro.authz.UnauthorizedException: 授权错误异常
            subject.login(token);
            System.out.println("认证成功");
        } catch (AuthenticationException e) {
            System.out.println("认证失败");
            e.printStackTrace();
        }
        //角色验证
        try {
            //方式一:hasRole 返回值true/false
            if (subject.hasRole("role3")) {
                System.out.println("角色验证成功");
            } else {
                System.out.println("角色验证失败");
            }
            //方式二:checkRole 只要验证失败就报异常
            //subject.checkRole("role1");
            //System.out.println("角色验证成功");

            //hasRoles: 参数List集合 返回boolean数组 返回顺序与传递顺序一一对应 传普通用户,高级用户,管理员 返回false,false,true
            //hasAllRoles: 参数Collection集合 返回true/false 如果有一个角色验证失败就返回false
        } catch (Exception e) {
            System.out.println("角色验证失败");
            e.printStackTrace();
        }
        try {
            //isPermitted方式
            if (subject.isPermitted("system:user:update")) {
                System.out.println("权限验证成功");
            } else {
                System.out.println("权限验证失败");
            }

            //checkPermission方式
            //subject.checkPermission("system:user:update");
            //System.out.println("权限验证成功");
        } catch (Exception e) {
            System.out.println("权限验证失败");
            e.printStackTrace();
        }
        //7、安全退出
        subject.logout();
    }

输出

输入错误的权限如system1:user:update,报错:

2、 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电路中的repeater是什么?

最近在看interlaken协议&#xff0c;有一个单词&#xff0c;repeater&#xff0c;不知道是什么含义&#xff0c;查了一下发现它的功能是提高数据的完整性&#xff0c;要么是修复时钟&#xff0c;要么是提高信号裕量等。总之是让信号变好的一个东西。 具体可以参见TI的说明。 【…

企业资产负债表API:获取企业资产负债表数据的重要工具

前言 在当今的数字化时代&#xff0c;信息的获取和整合对于企业的决策和规划至关重要。企业资产负债表API是一种强大的工具&#xff0c;可以帮助企业快速、准确地获取资产负债表数据&#xff0c;从而更好地分析财务状况、做出投资决策以及评估经营绩效。本文将介绍企业资产负债…

【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)

阅读导航 引言一、生产者消费者问题&#x1f341;将生产者消费者模型比喻为超市的顾客和供货商 二、C queue模拟阻塞队列的生产消费模型&#xff08;伪代码&#xff09;三、RAII风格的加锁方式1. 简介2. 示例 四、基于Linux操作系统使用C代码&#xff0c;采用RAII风格的加锁方式…

flutter的ListView和SingleChildScrollView有什么区别?他们的使用场景有什么不一样?

文章目录 简介ListViewSingleChildScrollView使用场景的不同 简介 ListView和SingleChildScrollView都是在Flutter中用于处理滚动内容的组件&#xff0c;但它们有一些关键的区别。 ListView 多个子元素&#xff1a; ListView是一个滚动的可滚动组件&#xff0c;通常用于包含多…

写字基本功 - 正确握笔姿势

写字基本功 - 正确握笔姿势 1. 写字基本功 郑文彬 (布衣) 先生 2. 正确握笔步骤 握笔姿势教学 http://www.bebosspen.com/index.php/correct 3. 正确握笔姿势 - 重点解说图 握笔姿势教学 http://www.bebosspen.com/index.php/correct 3.1. 食指 食指低于拇指 两段弯曲勿三…

【价值几十万的仿抖音直播电商系统源码共享】

当下&#xff0c;传统的图文电商模式已经走向没落&#xff0c;以抖音为首的直播电商模式备受用户追捧&#xff0c;它具有实时直播和强互动的特点&#xff0c;是传统电商所不具备的优势。而且&#xff0c;当前正是直播电商的红利期&#xff0c;很多主播和品牌商都通过直播电商业…

[Halcon模块] Halcon13.0查询算子模块归属

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

【C语言 | 指针】数组参数 和 指针参数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

IDEA利用插件完成properties与yml的互相转换(mac与wins通用)

步骤一、插件安装 点击屏幕左上方的IDEA&#xff0c;然后点击Preferences(相当于wins里的settings) 进入后点击Plugins&#xff0c;在插件商城中搜索并安装 Convert YAML and Properties File 这个插件 二、使用 右键选择你需要转换的配置文件&#xff0c;选择Convert YAML …

解决高风险代码:Mass Assignment: Insecure Binder Configuration

Abstract 用于将 HTTP 请求参数绑定到模型类的框架绑定器未显式配置为允许或禁止特定属性 Explanation 为便于开发和提高生产率&#xff0c;现代框架允许自动实例化一个对象&#xff0c;并使用名称与要绑定的类的属性相匹配的 HTTP 请求参数填充该对象。对象的自动实例化和填充…

安装Anaconda和pytorch

首先看下自己电脑是否有英伟达的显卡&#xff0c;如果有的话可以安装GPU版本&#xff0c;没有的话可以安装CPU版本。 CPU版本 1.安装Anaconda 首先去官网下载Anaconda。 点击download&#xff0c;下载的就是最新版本的。 下载完成后&#xff0c;直接运行下步就行 注意到路径…

Chrome更新

Chrome无法通过360软件管家升级&#xff0c;最方便的升级方法应该是通过Chrome本身进行升级&#xff0c;但可能需要自备梯子。 点击Chrome右上角三个点 点击帮助 点击关于Google Chrome 在弹出的页面中查看是否是最新版本&#xff0c;如果不是最新版本会有一个升级的按钮&a…

开题PPT答辩复盘

目录 总体思路加粗和红体字使用研究现状之后主要研究内容讨论 总体思路 分为五个部分&#xff0c;规定在10分钟以内讲完。这次开题答辩&#xff0c;主要是要讲清楚研究背景和意义&#xff0c;国内外研究现状。因此前两部分需要花大概6分钟重点解释&#xff0c;主要研究内容用2…

【Linux】进程周边003之进程优先级

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.基本概念 2.PRI与NI 3.利…

使用护眼台灯能不能有效预防近视?分享高品质的护眼台灯

在近几年&#xff0c;儿童青少年近视率非常高。很多家长认为孩子近视的原因是没有养成正确的用眼习惯&#xff0c;例如经常趴桌子写作业、眯眼看书等&#xff0c;但实际上这些坏习惯是因为没有合适的光线而导致的。所以安排一盏合适的台灯给孩子学习是非常重要的。 目前而言最好…

图片压缩软件4K Image Compressor Pro mac特点介绍

4K Image Compressor Pro mac是一款专业的图片压缩软件&#xff0c;它可以在不损失图像质量的前提下&#xff0c;优化图片文件的大小&#xff0c;从而节省存储空间&#xff0c;方便在社交媒体上共享图片&#xff0c;并优化网站加载速度。 4K Image Compressor Pro mac软件特点 …

29、Windows安全配置

文章目录 一、Windows安全配置简介二、账户策略2.1 密码策略2.2 账户锁定策略 三、本地策略3.1 用户权限分配 四、安全设置4.1 账户4.2 审核4.3 设备4.4交互式登录4.5 网络访问4.6 网络安全4.7 用户账户控制4.8 防火墙配置 五、高级审核策略设置5.1 账户登录5.2 账户管理5.3 对…

MDM主数据平台如何实现质量管控

当企业业务以及信息化建设发展到一定阶段后&#xff0c;都不可避免地要进行信息化和数据的治理工作&#xff0c;而主数据治理则是数据治理的基础。随着信息系统和业务的增加&#xff0c;系统打通与数据集成共享必然会成为企业信息化建设的瓶颈&#xff0c;而要实现系统集成&…

怪兽吃糖果

欢迎来到程序小院 怪兽吃糖果 玩法&#xff1a;左右飞出的糖果&#xff0c;点击鼠标糖果即为怪兽吃掉&#xff0c;不同的糖果不同的分数奖励&#xff0c; 吃不掉的糖果会扣除一次生命&#xff0c;共三次生命值&#xff0c;点击炸弹游戏结束&#xff0c;快去吃糖果吧^^开始游戏…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏&#xff1a; Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址&#xff1a;Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景&#xff1a; 车辆检测及型号识别广泛应用于物业&#xff0c;交通等的管理场景中。通过在停车场出入口…