Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
一、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、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权
Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略: AtleastOneSuccessfulStrategy[默认] 如果一个或多个Realm ...
- shiro框架采取MD5+salt方式加密密码
1.Maven配置 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-s ...
- Shiro与SpringBoot整合,实现登录拦截、用户认证、用户授权等。实战demo
文章目录 开篇必读: 一.开发环境 二.项目搭建 三.配置 shiro 配置类 1.自定义 Realm 类. 2.创建shiro配置类. 四.创建页面.Controller. Service等. 五. ...
- shiro框架的使用流程
Shiro框架主要用于应用程序的安全管理,包括认证.授权.会话管理等功能.以下是Shiro框架的具体使用步骤: 引入Shiro依赖:在项目中引入Shiro的相关依赖,例如Shiro-core.Shir ...
- 微信第三方平台公众号授权流程1—第三方平台概述概述
一.概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认证后的开发 ...
- Shiro框架在项目中的应用
1.Shiro 框架简介 Shiro 概述 Shiro 是Apache公司推出一个权限管理框架,其内部封装了项目中认证,授权,加密,会话等逻辑操作,通过Shiro框架可以简化我们项目权限控制逻辑的代码 ...
- shiro框架---解决权限限制问题
shiro简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密(核心功能). 以下是你可以用 Apache Shiro所做的事情: 1. ...
- shiro框架多realm登录认证配置
我们做shiro框架经常会遇到这种情况,用户数量很多,又不在同一个表里,比如管理员一个表,用户一个表,商家一个表.这时我们就需要用到多realm来配置让他们用不同得realm来进行登录 首先来说思路, ...
最新文章
- 2022-2028年中国香精香料行业投资分析及前景预测报告
- Caffe源码中Pooling Layer文件分析
- 如何获得10倍的用户增长?| 文末福利
- SQL Server中常用的SQL语句
- 计算机网络按定义分,计算机网络定义及其分类
- IDEA中无法识别servlet类或找不到javax.servlet.*
- HTTPGet 与HTTPPost的区别
- leetcode 225. 用队列实现栈(维护两个队列用于倒替元素,使用和1进行按位与,实现队列切换)
- 互联网产品跨部门沟通的10个原则(转)
- 实操教程丨如何将一个k3s集群集成到Gitlab项目中
- 利用EGM96和EGM2008模型,分别计算计算高程异常、重力异常和垂线偏差。
- C语言烟花代码,C语言实现烟花表白代码
- 用计算机写高中数学程序框图,画“程序框图”,高中数学最实用基本技能之一...
- 如何在MATLAB下载附加功能(下载Min-GW总结)
- 爬虫爬取知乎评论并利用flask框架做简单的可视化
- php话费充值,手机话费充值接口
- Navicat导出整个数据库
- scratch教程——弹球游戏
- 豆瓣电影分析报告:大陆和港台到底差(cha)在哪里?
- Robotium 介绍