【笔记】04.Shiro实现授权

本文详细介绍了Shiro授权的概念,包括授权概述、关键对象(主体、资源、权限、角色)的解析,以及授权流程。同时,讲解了如何通过subject相关方法进行权限检查,并提到了配置文件shiro.ini的修改和测试环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

04Shiro实现授权

1.授权概述

  • 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。

2.关键对象介绍

1.主体

  • 即访问应用的用户,在shiro中使用subject代表该用户,用户只有授权后才允许访问响应的资源

2.资源

  • 在应用中用户可以访问的任何东西,比如访问JSP页面、查看/编辑某些数据,访问某个业务方法、打印文本等等都是资源。用户只有授权后才能访问。

3.权限

  • 安全策略中的原子授权单位,通过权限我们可以表示在应用中用户没有没有操作某个资源的权利。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增删改查)式权限控制)打印文档等

4.角色

  • 角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO等都是角色,不同角色拥有一组不同的权限。

3.shiro授权流程

4.相关方法说明

  1. subject.hasRole(""); //判断是否有角色
  2. subject.hasRoles(List); //分别判断用户是否具有List中每个内容
  3. subject.hasAllRoles(Collection); //返回Boolean,要求参数中所有角色用户都需要具有
  4. subject.isPermitted(""); //判断是否具有权限

5.修改shiro.ini文件

#配置用户
[users]
zhangsan=123456,role1
lisi=123456,role2
wangwu=123456,role3
zhaoliu=123456,role2,role3
sunqi=123456,role4

#声明角色
[roles]
role1=user:query,user:add,user:update,user:delete,user:export
role2=user:query,user:add
role3=user:query,user:export
role4=*:*

6.测试

        // 判断用户是否认证通过
        boolean authenticated = subject.isAuthenticated();
        System.out.println("是否认证通过:" + authenticated);

        // 角色判断
        boolean hasRole1 = subject.hasRole("role1");
        System.out.println("是否有role1的角色:" + hasRole1);

        // 分别判断集合里面的角色,返回数组
        List<String> roleIdentifiers = Arrays.asList("role1", "role2", "role3");
        boolean[] hasRoles = subject.hasRoles(roleIdentifiers);
        for (boolean b : hasRoles) {
            System.out.println(b);
        }

        // 判断当前用户是否有roleIdentifiers集合里面的所有角色
        boolean hasAllRoles = subject.hasAllRoles(roleIdentifiers);
        System.out.println("是否有roleIdentifiers里的所有角色" + hasAllRoles);


        //权限判断
        boolean permitted = subject.isPermitted("user:query");
        System.out.println("判断当前用户是否有user:query的权限" + permitted);

        boolean[] permitted1 = subject.isPermitted("user:query", "user:add", "user:export");
        for (boolean b : permitted1) {
            System.out.println(b);
        }

        boolean permittedAll = subject.isPermittedAll("user:query", "user:add", "user:export");
        System.out.println(permittedAll);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值