shiro权限管理的框架

1.权限管理的概念

​ 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

2.认证

1.认证的概念

  • 认证:用户访问系统的控制

2.认证中抽象出的对象

  • subject :主体相当于之前的user,访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;
  • Principal:身份信息,是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。
  • credential:凭证信息,是只有主体自己知道的安全信息,如密码、证书等.

3.授权

1.授权的概念

  • 授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

2.授权中抽象对象

  • Who,即主体(Subject),主体需要访问系统中的资源。
  • What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。
  • How,权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。权限分为粗颗粒和细颗粒,粗颗粒权限是指对资源类型的权限,细颗粒权限是对资源实例的权限。

4.权限模型

5.权限控制的方案

1.基于角色的权限控制

RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xoFC8nqZ-1594712175008)(F:\document-pic\2.png)]

if(主体.hasRole(“总经理角色id”)){

​ 查询工资

}

2.基于资源的权限控制

RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制,比如:主体必须具有查询工资权限才可以查询员工工资信息等,访问控制流程如下:

if(主体.hasRole(“查询工资的权限”)){

​ 查询工资

}

6.什么是shiro

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

7.为什么要学shiro

既然shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

8.shiro的核心架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZnoJ06z-1594712175011)(F:\document-pic\shiro架构-core.png)]

9.shiro的第一个程序

1.导入jar

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version>
</dependency>

2.第一个认证的程序

//获取安全管理器工厂IniSecurityManagerFactory iniSecurityManagerFactory=new IniSecurityManagerFactory("classpath:shiro.ini");//获取安全管理器SecurityManager securityManager=iniSecurityManagerFactory.getInstance();SecurityUtils.setSecurityManager(securityManager);//获取主体对象Subject subject = SecurityUtils.getSubject();//token就是用户的令牌 包含用户的身份信息和凭证信息AuthenticationToken token=new UsernamePasswordToken("zhangsan","1234567");try {subject.login(token);} catch (AuthenticationException e) {e.printStackTrace();}boolean authenticated = subject.isAuthenticated();

3.配置文件

[users]
zhangsan=123456
lisi=123456

**注意:**shiro中主体是否认证成功是通过抛异常的形式体现的,一般会抛出两个异常

  • UnknownAccountException 账号异常

  • IncorrectCredentialsException 密码异常

10.shiro认证连接数据库

1.源码追踪中出现的关键对象

AuthenticatingRealm  //抽象类//3.关键属性 该属性为凭证匹配器CredentialsMatcher credentialsMatcher;//1.该方法为抽象方法 其作用使用来获取数据protected abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken var1) throws AuthenticationException;
SimpleAccountRealm
//2.实现了AuthenticatingRealm抽象方法,用来获取配置文件中的用户信息,该类不做数据比对
SimpleCredentialsMatcher
//4.shiro中默认的凭证匹配器public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {Object tokenCredentials = this.getCredentials(token);Object accountCredentials = this.getCredentials(info);return this.equals(tokenCredentials, accountCredentials);}

2.连接数据库

1.开发自定义realm
public class MyRealm extends AuthenticatingRealm {protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {//略  数据操作 并且根据相应格式返回 不做比对}
}
2.告知shiro要使用自定义realm
[main]
#自定义 realm
customRealm=com.baizhi.day1.MyRealm
#将realm设置到securityManager
securityManager.realms=$customRealm

注意:需要导入一个jar

<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency>

11.shiro的加密认证方式

1.realm返回密文数据

public class MyRealm extends AuthenticatingRealm {@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {AuthenticationInfo authenticationInfo =authenticationInfo = new SimpleAuthenticationInfo("zhangsan", "3d53b73c485f523ef2fe45f2b8dd3c58", ByteSource.Util.bytes("ABCD"), this.getName());return authenticationInfo;}
}

2.修改配置文件,加入凭证匹配器的相关配置

[main]
#自定义凭证匹配器
hashedCredentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher#自定义 realm
customRealm=com.baizhi.day1.MyRealm
#凭证匹配器告诉谁
customRealm.credentialsMatcher=$hashedCredentialsMatcher
hashedCredentialsMatcher.hashAlgorithmName=MD5
hashedCredentialsMatcher.hashIterations=1024
#将realm设置到securityManager
securityManager.realms=$customRealm

12.授权

1.授权数据来源于数据库

public class MyRealm extends AuthorizingRealm {//获取数据  获取认证的数据protected  AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){//数据库操作   基于身份信息查主体}//获取数据  获取授权的数据protected  AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection var1){//数据库操作   基于身份信息查主体   基于主体查角色    基于角色查权限}}

2.java环境下授权的api

  • 基于角色

                //判断当前主体是否包含此角色boolean b = subject.hasRole("super");List<String> list = Arrays.asList("super", "admin");//判断当前主体是否包含某个角色boolean[] booleans = subject.hasRoles(list);//判断当前主体是否包含全部的角色boolean b = subject.hasAllRoles(list);
    
  • 基于资源

                boolean b = subject.isPermitted("admin:delete");String[] strs={"admin:delete", "admin:add"};boolean[] permitted = subject.isPermitted(strs);boolean permittedAll = subject.isPermittedAll(strs);
    

3.权限的标识符

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

例子:

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

ean permittedAll = subject.isPermittedAll(strs);

#### 3.权限的标识符权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。例子:- 用户创建权限:user:create,或user:create:*
- 用户修改实例001的权限:user:update:001
- 用户实例001的所有权限:user:*:001

shiro权限管理的框架、加密、授权相关推荐

  1. Shiro权限管理详解(授权和注解开发)【面试点】

    Shiro权限管理详解 1. 权限管理 1.1什么是权限管理 1.2用户身份认证 1.2.1 概念 1.2.2 用户名密码身份认证流程 1.2.3 关键对象 1.3 授权 1.3.1 概念 1.3.2 ...

  2. Shiro 权限管理入门之认证与授权

    Shiro 权限管理 什么是权限管理? 什么是身份认证? 什么是授权? Shiro 是什么? Shiro 的核心架构 Shiro 中的认证 认证关键对象 认证流程 认证的开发 自定义 Realm Si ...

  3. Spring Boot Shiro 权限管理

    Spring Boot Shiro 权限管理 标签: springshiro 2016-01-14 23:44 94587人阅读 评论(60) 收藏 举报 本来是打算接着写关于数据库方面,集成MyBa ...

  4. Shiro权限管理实现(详解)

    前言 Apache Shiro 是 Java 的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. 功能介绍 资源-角色-权限 ...

  5. shiro权限管理基本原理和实现的整理

    shiro权限管理基本原理和实现的整理 引言:这两天学习了一个对权限管理的新的框架shiro,在这里做一个总结,既为了帮助有需要的人,也方便自己以后来回顾. 本篇文章主要针对下面几个关键点来说明: 1 ...

  6. SSM集成shiro权限管理

    这几天在学习了shiro权限管理框架,在刚开始的时候学的时候因为这个配置问题困扰了我很长时间,所以在这篇文章我整合了自己用SSM搭建shiro权限框架的过程. 1.配置 1.1jar包 在项目配置开始 ...

  7. Springboot之Shiro权限管理

    文章目录 Springboot之Shiro权限管理 介绍 1.shiro有三个核心api(接口) 2.如何使用: 第一步导入shiro与springboot整合依赖 第二步配置shiro类 第三步自定 ...

  8. 39 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    [视频 & 交流平台] à SpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008& ...

  9. shiro权限管理的应用

    shiro权限管理的应用 官网:http://shiro.apache.org 一, 什么是权限管理: 对系统中的资源进行权限配置 , 对资源的一种保护 : 一般需要进过两个步骤: 身份认证- 授权 ...

最新文章

  1. 表达式封装和模型驱动封装的区别
  2. Intellij Idea的使用之svn篇
  3. 第六章 文件I/O编程 [notice select() at RIL.pdf] [串口开发]
  4. 基于EasyNetQ的RabbitMQ封装类
  5. AngularJS-compareDirective.js 验证指令
  6. MQTT 控制报文 - PUBLISH发布消息,PUBACK,PUBREC,PUBREL,PUBCOMP - 第6章
  7. Google将推游戏内广告技术 游戏中插入视频广告
  8. 服务器下 读取springboot application配置文件_一文读懂 Spring Boot 配置文件 application.properties !...
  9. C/C++回调方式系列之一 函数指针和函数回调模式
  10. 萤火虫算法_萤火虫算法(一)
  11. redis下载安装教程
  12. ShaderForge安装教程
  13. nginx防盗链配置
  14. CAN总线学习笔记(1)- CAN基础知识
  15. macd java_macdev/java.md at master · pubyun/macdev · GitHub
  16. Javaweb开发学习笔记(三)
  17. 常用SEISMIC BINARY数据的读取
  18. 笔记本计算机排名2015,2015性价比高的笔记本电脑排行榜
  19. 【蓝桥杯真题】成绩统计
  20. CSS语法(二)——两个选择器及其扩展

热门文章

  1. Nature子刊:对EcoG脑机接口进行无监督适应
  2. 银联支付Java开发
  3. 艾默生流量计重油流量计的测量原理和优势
  4. 基于分段式随机惯性权重和最优反馈机制的鲸鱼优化算法
  5. 企业电子招标采购系统源码Spring Cloud + Spring Boot 前后端分离 + 二次开发
  6. Oracle授权普通用户 kill session权限
  7. c语言碱基配对的算法,OpenJudge计算概论-配对碱基链
  8. oracle 开链,开链运动与闭链运动的区别
  9. Mac必备一款全网视频播放器 - ZY Player
  10. 【2022/02/04】thinkphp源码详细阅读(二)