1)Shiro授权过程


2)授权方式

shiro支持三种方式的授权:

  • 编程式:通过写if/else授权代码块完成:
Subject  subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){//有权限
}else{//无权限
}
  • 注解方式:通过在执行的java 方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello(){//有权限
}
  • jsp标签: 在jsp页面通过相应的标签完成
<shiro:hasRole name="admin">
<!-- 有权限 -->
</shiro:hasRole>

3)编写shiro-permission.ini

创建存放权限的配置文件shiro-permission.ini,里面的内容相当于在数据库里面:

[users]
#用户admin的密码是123,此用户具有role1和role2两个角色
admin=123,role1,role2
#zs的密码是123,此用户拥有role2角色
zs=123,role2[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create权限
role2=user:create

在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2…” “角色=权限1,权限2…”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。

权限字符串规则

权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:

  • 用户创建权限:user:create,或user:create:*
  • 用户修改实例001的权限:user:update:001
  • 用户实例001的所有权限:user:*:001

4)测试代码

@Test
public void testPermission(){//创建securityManager工厂,通过ini配置文件创建securityManager工厂Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-permission.ini");//创建SecurityManagerSecurityManager securityManager=factory.getInstance();//将securityManager设置到当前运行环境中SecurityUtils.setSecurityManager(securityManager);//从SecurityUtils里边创建一个subjectSubject subject = SecurityUtils.getSubject();//对主体对象进行认证//用户登录//设置用户认证的身份(prinicipals)和凭证(credentials)UsernamePasswordToken token = new UsernamePasswordToken("admin", "123");subject.login(token);//用户认证状态//是否认证通过boolean isAuthenticated =subject.isAuthenticated();System.out.println("是否认证通过:"+isAuthenticated);//用户授权检测 基于角色授权//是否有某一个角色System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));// 是否有多个角色System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));  //判断角色 没有则直接报异常//subject.checkRole("role2");// 基于资源授权System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));//检查权限//subject.checkPermission("sys:user:delete");//subject.checkPermissions("user:create:1","user:delete");
}

5)自定义realm

与上面认证自定义realm一样,大部分情况是要从数据库获取权限数据,这里直接实现基于资源的授权。

编写自定义realm

在认证章节写的自定义realm类中完善doGetAuthorizationInfo方法,此方法需要完成:根据用户身份信息从数据库查询权限字符串,由shiro进行授权。

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//获取身份信息String username=(String) principals.getPrimaryPrincipal();//根据身份信息从数据库中查询权限数据//...从这里使用静态数据模拟List<String> permissions=new ArrayList<String>();permissions.add("user:create");permissions.add("user:delete");//将权限信息封闭为AuthorrizationInfoSimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();for(String permission:permissions){simpleAuthorizationInfo.addStringPermission(permission);}return simpleAuthorizationInfo;
}

配置realm

ini配置文件还使用认证阶段使用的,不用改变。

修改test中创建securityManager工厂的配置文件

//创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");

6)授权执行流程

  1. 执行subject.isPermitted(“user:create”)
  2. securityManager通过ModularRealmAuthorizer进行授权
  3. ModularRealmAuthorizer调用realm获取权限信息
  4. ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配

下一章我们详细Spring整合shiro的使用

Shiro(三)——Shiro授权入门案例相关推荐

  1. Mybatis-Plus(入门篇 ==> 三分钟完成入门案例

    本章导学: 创建SpringBoot导入坐标 编写配置文件 创建实体类 创建mapper继承BaseMapper 测试 本章所使用的数据 -- MySQL dump 10.13 Distrib 8.0 ...

  2. Phoenix安装、入门案例

    目录 一.Phoenix简介 1.什么是Phoenix 2.Phoenix性能 二.Phoenix的安装部署 三.Phoenix入门案例 四.建立与HBase表映射 五.使用Phoenix构建二级索引 ...

  3. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权

    一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...

  4. Shiro笔记(三)授权

    Shiro笔记(三)授权 一.授权方式 1.编程式: 1 Subject subject=SecurityUtils.getSubject(); 2 if(subject.hasRole(" ...

  5. Shiro认证和授权

    shiro介绍 什么是shiro Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. ...

  6. 视频教程-Apache Shiro权限框架实战+项目案例视频课程-Java

    Apache Shiro权限框架实战+项目案例视频课程 拥有10余年项目实战经验. 2006-2011在nttdata从事对日软件开发类工作. 2011-2015在HP从事技术服务工作. 擅长于j2e ...

  7. shiro认证与授权

    1.shiro认证 1.1.身份验证 身份验证:一般需要提供如身份ID等一些标识信息来表明登录者的身份,如提供email,用户名/密码来证明. 在shiro中,用户需要提供principals(身份) ...

  8. 运用Maven 搭建SSM框架,并用shiro控制登录授权

    一.准备工作 jdk1.8环境,maven3.x安装(指定本地仓库地址),Tomcat7以上安装 本次使用Eclipse搭建项目 Eclipse 的编译环境设置一下,utf-8 二.新建Maven工程 ...

  9. shiro.ini实现授权

    shiro.ini实现授权 前提:必须先认证通过之后有授权之说 1,授权概述 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体 ...

  10. matlab快速入门案例及常用技巧 | 《matlab数学建模方法与实践(第三版)》学习笔记

    目录 快速入门案例: 解决流程: 具体实现: 一.获取数据 二.数据探索和建模 三.分享结果 常用技巧 一.常用标点功能 二.常用操作指令 三.指令编辑操作键 四.matlab数据类型 五.开发模式 ...

最新文章

  1. Centos5.5完整安装Cacti+Spine
  2. 电商平台 高并发 微服务 方案_Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战...
  3. WSL+VSCODE体验UBUNTU环境下的开发
  4. web project、web service project和java project的区别
  5. Linux学习之后台运行进程
  6. scala的数值类型(三)
  7. 计算机应用技术和信息化,浅析企业计算机应用技术和信息化建设
  8. dpdk大页内存实现
  9. TCMPC进阶之路——accumulate函数应用
  10. 学会Java输入输出流,看这一篇就够了,建议收藏!
  11. 阿里云E-HPC+i4p大内存实例,加速寻因生物单细胞数据分析效率
  12. 关于2440嵌入式MPlayer播放器的移植方法
  13. 阿里云 EMAS Serverless 重磅发布
  14. C语言标准ANSI C、C语言的特点、C语言的关键字(32个)
  15. 如何真正做好客户管理
  16. 计算机组成原理复习提纲六(CPU结构和功能)
  17. 项目管理工具之Git/GitHub/Gitee/Gitlab
  18. android p 牛轧糖_如何启用Android牛轧糖的猫收集复活节彩蛋
  19. 详解六种常见的上下文切换场景
  20. 【WWW 2021】【阿里小蜜】QAMaker:一站式的文档问答对抽取

热门文章

  1. 动手设计 CPU(三)—— 微程序控制的存储器读写系统设计
  2. 【洛谷 P3384】树链剖分【详解树链剖分】
  3. 上海自考计算机应用基础实践,上海自考《计算机应用基础》试题练习(八)
  4. php autosub,教你用PHP实现微信小程序人脸识别刷脸登录功能
  5. mysql两个下拉框_两个下拉框的纠葛
  6. sql依据单个字段去重_Java面试之常用SQL
  7. YAML_06 playbook从上往下顺序执行,若报错,不提示,继续往下执行
  8. hadoop ha环境下的datanode启动报错java.lang.NumberFormatException: For input string: 10m
  9. Java Web GenericServlet
  10. 使用“牛顿迭代法”求解方程