一、Shiro授权:

1、授权与权限:

(1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源。

(2)权限模型:标准权限数据模型包括 :用户、角色、权限(包括资源和权限)、用户角色关系、角色权限关系。

(3)权限分配:通过UI界面方便给用户分配权限,对上边权限模型进行增、删、改、查操作。

(4)权限控制:

第一种:基于角色的权限控制:根据角色判断是否有操作权限,因为角色的变化性较高,如果角色修改需要修改控制代码,系统可扩展性不强。

第二种:基于资源的权限控制:根据资源权限判断是否有操作权限,因为资源较为固定,如果角色修改或角色中权限修改不需要修改控制代码,使用此方法系统可维护性很强。建议使用。

(5)权限管理的解决方案:

①对于粗颗粒权限管理,建议在系统架构层面去解决,写系统架构级别统一代码(基础代码)。

粗颗粒权限:比如对系统的url、菜单、jsp页面、页面上按钮、类方法进行权限管理,即对资源类型进行权限管理。

②对于细颗粒权限管理:细颗粒权限管理是系统的业务逻辑,业务逻辑代码不方便抽取统一代码,建议在系统业务层进行处理。

粗颗粒权限:比如用户id为001的用户信息(资源实例)、类型为t01的商品信息(资源实例),对资源实例进行权限管理,可以理解为对数据级别的权限管理。

2、授权流程:

(1)对subject进行授权,调用方法isPermitted("permission串");

(2)SecurityManager执行授权,通过ModularRealmAuthorizer执行授权;

(3)ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据,调用realm的授权方法:doGetAuthorizationInfo;

(4)realm从数据库查询权限数据,返回ModularRealmAuthorizer;

(5)ModularRealmAuthorizer调用PermissionResolver进行权限串比对;

(6)如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常。

3、Shiro 支持三种方式的授权:

(1)编程式:通过写if/else 授权代码块完成:

Subject subject = SecurityUtils.getSubject();

if(subject.hasRole(“admin”)) {

//有权限

} else {

//无权限

}

(2)注解式:通过在执行的Java方法上放置相应的注解完成:

@RequiresRoles("admin")

public void hello() {

//有权限

}

(3)JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:

<shiro:hasRole name="admin">

<!— 有权限—>

</shiro:hasRole>

二、Shiro授权示例程序:

1、入门的Shiro授权程序:

(1)编写shiro-permission.ini文件:

shiro-permission.ini文件里边的内容相当于在数据库查询出来的;

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

权限标识符号规则:资源:操作:实例(中间使用半角:分隔)

user:create:01  表示对用户资源的01实例进行create操作。

user:create    表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。

user:*:01  表示对用户资源实例01进行所有操作。

(2)程序编写:

//shiro的授权测试:
public class AuthorizationTest {//角色授权、资源授权测试:@Testpublic void testAuthorization(){Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");SecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123456");try {subject.login(token);} catch (AuthenticationException e) {e.printStackTrace();}System.out.println("认证状态:" + subject.isAuthenticated());//认证通过之后执行授权://基于角色的授权//hasRole传入角色标识:boolean ishasRole = subject.hasRole("role1");System.out.println("单个角色判断" + ishasRole);//hasAllRoles是否拥有多个角色:boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1","role2","role3"));System.out.println("多个角色判断" + hasAllRoles);// 使用check方法进行授权,如果授权不通过会抛出异常subject.checkRole("role2");//基于资源的授权://isPermitted传入权限标识符boolean isPermitted = subject.isPermitted("user:create:1");System.out.println("单个权限判断" + isPermitted);boolean isPermittedAll = subject.isPermittedAll("user:create:1","user:delete");System.out.println("多个权限判断" + isPermittedAll);// 使用check方法进行授权,如果授权不通过会抛出异常subject.checkPermission("items:delete:1");}
}

(3)执行结果:

至此,Shiro授权入门程序就完成了。在这个程序中,我们读取的是在shiro.ini配置文件中静态配置好的权限内容,但是在实际开发,我们通常是从数据库中查询用户所拥有的权限信息,因此,我们需要使用自定义的Realm进行从数据库中查询用户的权限信息。

2、自定义realm进行授权:

上面的程序是通过shiro-permission.ini对权限文件进行静态配置,在实际开发中,都是从数据库中获取权限数据。就需要自定义realm,由realm从数据库查询权限数据。

realm根据用户身份查询权限数据,将权限数据返回给authorizer(授权器)。

(1)自定义realm:

//自定义的Realm,需要继承AuthorizingRealm,并且重写这个类的两个方法
public class CustomRealm extends AuthorizingRealm{// 设置realm的名称@Overridepublic void setName(String name) {super.setName("customRealm");}// 用于授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//从principals获取身份信息//将getPrimaryPrincipal方法返回值转为真实身份(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中的身份类型)String userCode = (String) principals.getPrimaryPrincipal();//根据身份信息获取权限信息//连接数据库//模拟从数据库获取到数据List<String> permissions = new ArrayList<String>();permissions.add("user:create");//用户的创建permissions.add("items:add");//商品添加权限//查到权限数据,返回授权信息(要包括上边的permissions)SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();//将上边查询到授权信息填充到simpleAuthorizationInfo对象中simpleAuthorizationInfo.addStringPermissions(permissions);return simpleAuthorizationInfo;}
}

(2)编写shiro-realm.ini文件:

在shiro-realm.ini文件中配置自定义的realm,将realm设置到securityManager中。

[main]
#自定义的realm
customRealm=com.zwp.shiro.realm.CustomRealm
#将realm设置到securityManager,相当于spring中的注入
securityManager.realms=$customRealm

(3)测试:

 // 自定义realm进行资源授权测试@Testpublic void testAuthorizationCustomRealm() {Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");SecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();// 创建token令牌UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123456");// 执行认证try {subject.login(token);} catch (AuthenticationException e) {e.printStackTrace();}System.out.println("认证状态:" + subject.isAuthenticated());// 认证通过后执行授权// 基于资源的授权,调用isPermitted方法会调用CustomRealm从数据库查询正确权限数据// isPermitted传入权限标识符,判断user:create:1是否在CustomRealm查询到权限数据之内boolean isPermitted = subject.isPermitted("user:create:1");System.out.println("单个权限判断" + isPermitted);boolean isPermittedAll = subject.isPermittedAll("user:create:1","user:create");System.out.println("多个权限判断" + isPermittedAll);// 使用check方法进行授权,如果授权不通过会抛出异常subject.checkPermission("items:add:1");}

(4)测试结果:

至此,Shiro使用自定义Realm进行授权的程序就完成了。

Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权相关推荐

  1. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  2. Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权

    Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略: AtleastOneSuccessfulStrategy[默认] 如果一个或多个Realm ...

  3. shiro框架采取MD5+salt方式加密密码

    1.Maven配置 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-s ...

  4. Shiro与SpringBoot整合,实现登录拦截、用户认证、用户授权等。实战demo

    文章目录 开篇必读: 一.开发环境 二.项目搭建 三.配置 shiro 配置类 1.自定义 Realm 类. 2.创建shiro配置类. 四.创建页面.Controller. Service等. 五. ...

  5. shiro框架的使用流程

    Shiro框架主要用于应用程序的安全管理,包括认证.授权.会话管理等功能.以下是Shiro框架的具体使用步骤: 引入Shiro依赖:在项目中引入Shiro的相关依赖,例如Shiro-core.Shir ...

  6. 微信第三方平台公众号授权流程1—第三方平台概述概述

    一.概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认证后的开发 ...

  7. Shiro框架在项目中的应用

    1.Shiro 框架简介 Shiro 概述 Shiro 是Apache公司推出一个权限管理框架,其内部封装了项目中认证,授权,加密,会话等逻辑操作,通过Shiro框架可以简化我们项目权限控制逻辑的代码 ...

  8. shiro框架---解决权限限制问题

    shiro简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密(核心功能). 以下是你可以用 Apache Shiro所做的事情: 1. ...

  9. shiro框架多realm登录认证配置

    我们做shiro框架经常会遇到这种情况,用户数量很多,又不在同一个表里,比如管理员一个表,用户一个表,商家一个表.这时我们就需要用到多realm来配置让他们用不同得realm来进行登录 首先来说思路, ...

最新文章

  1. 2022-2028年中国香精香料行业投资分析及前景预测报告
  2. Caffe源码中Pooling Layer文件分析
  3. 如何获得10倍的用户增长?| 文末福利
  4. SQL Server中常用的SQL语句
  5. 计算机网络按定义分,计算机网络定义及其分类
  6. IDEA中无法识别servlet类或找不到javax.servlet.*
  7. HTTPGet 与HTTPPost的区别
  8. leetcode 225. 用队列实现栈(维护两个队列用于倒替元素,使用和1进行按位与,实现队列切换)
  9. 互联网产品跨部门沟通的10个原则(转)
  10. 实操教程丨如何将一个k3s集群集成到Gitlab项目中
  11. 利用EGM96和EGM2008模型,分别计算计算高程异常、重力异常和垂线偏差。
  12. C语言烟花代码,C语言实现烟花表白代码
  13. 用计算机写高中数学程序框图,画“程序框图”,高中数学最实用基本技能之一...
  14. 如何在MATLAB下载附加功能(下载Min-GW总结)
  15. 爬虫爬取知乎评论并利用flask框架做简单的可视化
  16. php话费充值,手机话费充值接口
  17. Navicat导出整个数据库
  18. scratch教程——弹球游戏
  19. 豆瓣电影分析报告:大陆和港台到底差(cha)在哪里?
  20. Robotium 介绍

热门文章

  1. 物理化学 化学 动力学(下)
  2. keras从入门到放弃(二十二)一维卷积处理 RNN文本分类
  3. NLP神器—Gensim
  4. JavaScript 实现数据结构中的所有算法---通俗易懂
  5. 最新最全的视觉Transformer教程!论文分析 + 逐行Coding,带你轻松玩转ViT
  6. 成为年薪50W+的NLP工程师,需要哪些技能?
  7. 平安人寿福利BUFF重磅推介 | 北京研发中心职位速递
  8. Java软件开发:自定义MyBatis持久层框架
  9. 【Java基础】递归输出目录下所有文件路径
  10. HDU5726 线段树求解区间GCD