Java研学-Shiro安全框架(二)

四 Shiro 鉴权

1 介绍

  授权功能:就是为用户分配相关的权限的过程;鉴权功能:判断当前访问用户是否有某个资源的访问权限的过程。我们的权限管理系统是基于角色的权限管理,所以在系统中应该需要下面三个子模块:用户管理 2. 角色管理 3. 权限管理。我们所需要的就是将用户拥有的权限告知 Shiro,供其在权限校验的时候使用。
在这里插入图片描述

2 基于ini的鉴权

  ① 编写 ini 配置文件:shiro-author.ini

#用户的身份、凭据、角色
[users]
dahuang=888,hr,seller
xiaohuang=666,seller

#角色与权限信息,权限字符串也可以使用*通配符
[roles]
hr=user:list,user:delete
seller=customer:list,customer:save

  ② 测试

public class ShiroDemo {
	@Test
    public void testAuthorByIni(){
        // 认证功能
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        IniRealm realm = new IniRealm("classpath:shiro-author.ini");
        securityManager.setRealm(realm);
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("dahuang","888");
        subject.login(token);
        
        // 鉴权功能
        System.out.println("查当前用户是否有customer:list权限:" + subject.isPermitted("customer:list"));
        System.out.println("查当前用户是否有user:list权限:" + subject.isPermitted("user:list"));
        //根据结果返回布尔数组一一对应查看有无权限
        System.out.println("查当前用户是否有user:list,customer:list这两个权限:"
                + Arrays.toString(subject.isPermitted("user:list", "customer:list")));
        //只要有一项权限没有就返回false
        System.out.println("查当前用户是否有user:list,customer:list这两个权限:"
                + subject.isPermittedAll("user:list", "customer:list"));
        System.out.println("-------------------------");
        // 有权限正常运行,没权限抛异常,可进行捕获
        //subject.checkPermission("user:list");
        System.out.println("后续代码...");
        System.out.println("===================================");
        System.out.println("当前用户是否有seller角色:" + subject.hasRole("seller"));
        System.out.println("当前用户是否有seller角色:" + subject.hasRole("hr"));
        //有角色无反应,没有就报错
        subject.checkRole("hr");
    }
}

3 基于自定义Realm的鉴权

  ① 模拟数据库mapper

public class DataMapper {
    //用户集合
    private static Map<String, User> userData = new HashMap<String, User>();
    //角色集合
    private static Map<String, List<String>> roleData = new HashMap<String, List<String>>();
    //权限集合
    private static Map<String, List<String>> permissionData = new HashMap<String, List<String>>();
    static{
        //初始化用户数据
        User u1 = new User("dahuang","666");
        userData.put(u1.getUsername(),u1);
        roleData.put(u1.getUsername(), Arrays.asList("seller"));
        permissionData.put(u1.getUsername(),
                Arrays.asList("customer:list","customer:save"));

        User u2 = new User("xiaohuang","888");
        userData.put(u2.getUsername(),u2);
        roleData.put(u2.getUsername(), Arrays.asList("seller","hr"));
        permissionData.put(u2.getUsername(),
                Arrays.asList("customer:list","customer:save","user:list","user:delete"));
    }
    //提供静态方法,模拟数据库返回数据
    public static User getUserByName(String username){
        return userData.get(username);
    }
    public static List<String> getRoleByName(String username){
        return roleData.get(username);
    }
    public static List<String> getPermissionByName(String username){
        return permissionData.get(username);
    }
}

  ② UserRealm 中为鉴权提供数据

// Realm是数据源 认证授权都只提供数据即可
public class UserRealm extends AuthorizingRealm {
    // 授权功能
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 获取当前登录用户 登录后(user已在环境中)才进行授权 principals中含有一切信息
        User user = (User) principals.getPrimaryPrincipal(); //获取在 doGetAuthenticationInfo 中存放在上下文中的对象
        String username = user.getUsername();
        // 当前登录用户的角色集合
        List<String> roles = DataMapper.getRoleByName(username);
        // 当前登录用户的权限集合
        List<String> permissions = DataMapper.getPermissionByName(username);
        // 需要将当前登录用户的权限和角色集合与返回的SimpleAuthorizationInfo 绑定关系
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addRoles(roles);
        info.addStringPermissions(permissions);
        return info;
    }
    // 认证功能
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 如何获取数据?  返回当前用户名(map的key)
        // String username = (String) token.getPrincipal();
        // 此处使用它的子类获取token
        UsernamePasswordToken token1 = (UsernamePasswordToken) token;
        // 通过token获取用户名
        String username = token1.getUsername();
        // 根据用户名去mapper中查询数据
        User user = DataMapper.getUserByName(username);
        if(user == null){
            return null;
        }
        // 需要返回一个  SimpleAuthenticationInfo 对象
        // 3个参数 (需要存储到上下文环境中的对象(登录成功后向session中存对象),密码信息,盐,Realm名字(这是父类的方法))
        return new SimpleAuthenticationInfo(user,user.getPassword(),
                ByteSource.Util.bytes(user.getSalt()),getName());
    }
}

  ③ 测试

public class ShiroDemo {
 	@Test
    public void testAuthorByIniUserRealm(){
        /*********************************** 认证功能 *************************************/
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        UserRealm realm = new UserRealm();
        securityManager.setRealm(realm);
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("qg","666");
        subject.login(token);
        /*********************************** 认证功能 *************************************/
        /*********************************** 鉴权功能 *************************************/
        System.out.println("当前用户是否有customer:list权限:"
                + subject.isPermitted("customer:list"));

        System.out.println("当前用户是否有user:list权限:"
                + subject.isPermitted("user:list"));
        System.out.println("当前用户是否有user:list权限:"
                + subject.isPermitted("user:list"));
        System.out.println("当前用户是否有seller角色:"
                + subject.hasRole("seller"));
        System.out.println("当前用户是否有hr角色:"
                + subject.hasRole("hr"));
    }
}

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

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

相关文章

Theta方法:一种时间序列分解与预测的简化方法

Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。 每个数据科学爱好者都知道&#xff0c;时间序列是按一定时间间隔收集或记录的一系列数据点。例如&#xff0c;每日温度或经济指标的月值。把时间序列想象成不同成分的组合&#xff0c;趋势(数据…

观测云产品更新 | Pipelines、智能监控、日志数据访问等

观测云更新 Pipelines 1、Pipelines&#xff1a;支持选择中心 Pipeline 执行脚本。 2、付费计划与账单&#xff1a;新增中心 Pipeline 计费项&#xff0c;统计所有命中中心 Pipeline 处理的原始日志的数据大小。 监控 1、通知对象管理&#xff1a;新增权限控制。配置操作权…

PCL 使用列文伯格-马夸尔特法计算变换矩阵

目录 一、算法原理1、计算过程2、主要函数3、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、计算过程 2、主要函数 void pcl

民用无人驾驶航空器运营合格证怎么申请

随着科技的飞速发展&#xff0c;无人机已经从遥不可及的高科技产品飞入了寻常百姓家。越来越多的人想要亲自操纵无人机&#xff0c;探索更广阔的天空。但是&#xff0c;飞行无人机可不是简单的事情&#xff0c;你需要先获得无人机许可证&#xff0c;也就是今天所要讲的叫民用无…

免费可视化工具为何成为数据分析新宠?

免费可视化工具为何越来越受欢迎&#xff1f;在当今数据驱动的时代&#xff0c;数据分析和展示已成为各行各业不可或缺的核心能力。然而&#xff0c;传统的数据处理和可视化工具往往价格昂贵&#xff0c;且使用门槛较高&#xff0c;这为许多中小企业和个人用户带来了不小的困扰…

微信浏览器自动从http跳转到https的坑

只要访问过同地址的https地址&#xff0c;就只能一直https了&#xff0c;无法再用https访问了&#xff0c;只能全站加上https才行。

电脑怎么设置锁屏密码?这3个方法你知道吗

在日常生活中&#xff0c;电脑已成为我们工作和娱乐的重要工具。为了保护个人信息和数据安全&#xff0c;设置锁屏密码是必不可少的一步。通过设置锁屏密码&#xff0c;您可以有效防止未经授权的访问&#xff0c;确保电脑上的隐私和数据不被泄露。本文将详细介绍电脑怎么设置锁…

【CSS in Depth 2 精译】1.5 渐进式增强

文章目录 1.5 渐进式增强1.5.1 利用层叠规则实现渐进式增强1.5.2 渐进式增强的选择器1.5.3 利用 supports() 实现特性查询启用浏览器实验特性 1.5 渐进式增强 要用好 CSS 这样一门不断发展演进中的语言&#xff0c;其中一个重要的因素就是要与时俱进&#xff0c;及时了解哪些功…

使用Python进行大数据处理Dask与Apache Spark的对比

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行大数据处理Dask与Apache Spark的对比 随着数据量的增加和数据处理需求的增长…

旅游管理系统源码小程序

便捷旅行&#xff0c;尽在掌握 旅游管理系统是一款基于FastAdminElementUNIAPP开发的多端&#xff08;微信小程序、公众号、H5&#xff09;旅游管理系统&#xff0c;拥有丰富的装修组件、多端分享、模板消息、电子合同、旅游攻略、旅游线路及相关保险预订等功能&#xff0c;提…

[leetcode]avoid-flood-in-the-city 避免洪水泛滥

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…

Redis实战—基于setnx的分布式锁与Redisson

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于SETNX的分布式锁 SETNX锁代码实现 修改业务代码 SETNX锁误删问题 SETNX锁原子性问题 Lua脚本 编写脚本 代码优化 总结 Redisson 前言…

Hadoop简单应用程序实例

Hadoop是一个分布式系统基础架构&#xff0c;主要用于大数据的存储和处理。它允许使用简单的编程模型跨集群处理和生成大数据集。Hadoop主要由HDFS&#xff08;Hadoop Distributed FileSystem&#xff0c;分布式文件系统&#xff09;和MapReduce编程模型两部分组成。 准备工作…

LeeCode 994. 腐烂的橘子

原题链接994. 腐烂的橘子 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;采用bfs遍历图&#xff0c;将烂橘子加入队列&#xff0c;然后将被烂橘子感染的橘子也加入队列&#xff0c;bfs的具体细节就不多说了&#xff0c;可以自己去搜&#xff0c;很简单&#xff0c;…

【并发编程】-1. 计算机内存架构、JAVA内存模型、Volatile关键字

JAVA内存模型JMM 概述 概念&#xff1a;Java Memory Model (JMM)JAVA内存模型是一种抽象的概念&#xff0c;描述的是一组规范&#xff0c;规范中定义了程序中各个变量&#xff08;实例字段、静态字段、数组对象的组成元素&#xff09;的访问方式&#xff0c;决定了一个线程对…

八皇后00

题目链接 八皇后 题目描述 注意点 每个皇后都不同行、不同列&#xff0c;也不在对角线上“对角线”指的是所有的对角线&#xff0c;不只是平分整个棋盘的那两条对角线 解答思路 本题与N皇后相同&#xff0c;思路仍然是深度优先遍历的同时存储前面每一行选取了哪些列&#…

深圳网页设计收费情况

深圳是中国最具活力和发展速度最快的城市之一&#xff0c;随着经济的快速发展&#xff0c;各种行业都飞速发展&#xff0c;尤其是互联网行业。网页设计是互联网行业的重要组成部分&#xff0c;深圳的网页设计师数量也是非常庞大的。那么&#xff0c;深圳网页设计师的收费情况是…

LLM 推理:Nvidia TensorRT-LLM 与 Triton Inference Server

随着LLM越来越热门&#xff0c;LLM的推理服务也得到越来越多的关注与探索。在推理框架方面&#xff0c;tensorrt-llm是非常主流的开源框架&#xff0c;在Nvidia GPU上提供了多种优化&#xff0c;加速大语言模型的推理。但是&#xff0c;tensorrt-llm仅是一个推理框架&#xff0…

互联网信息服务算法备案流程与要求

一、备案申请的办理流程 企业通过网信办的互联网信息服务算法备案系统&#xff08;https://beian.cac.gov.cn/#/index&#xff09;提交算法备案申请。填报信息包括三部分&#xff0c;分别是算法主体信息、产品及功能信息、算法信息。备案中比较重要的文件包括主体信息中的《落…