Shiro Review——自定义Realm实现授权

简介:    在自定义Realm中,可以进对数据库的查询,将认证后的用户的资源权限全部查询出来。/** * 自定义Realm * @author LiuHuiChao * */public class CustomRealm extends AuthorizingRealm{ ...


   在自定义Realm中,可以进对数据库的查询,将认证后的用户的资源权限全部查询出来。



/**
 * 自定义Realm
 * @author LiuHuiChao
 *
 */
public class CustomRealm extends AuthorizingRealm{

	
	
	@Override
	public void setName(String name) {
		super.setName("customName");
	}

	/**
	 * 认证方法
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		//1,从token中取出用户身份信息
		String userCode=(String)token.getPrincipal();
		
		//2,根据用户输入的账号从数据库查询
		String password="111111";//模拟从库里查询到的密码
		
		//2--1,查询不到返回null
		//2--2,查询到返回AuthenticationInfo
		SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(userCode,password,this.getName());
		
		return simpleAuthenticationInfo;
	}

	/**
	 * 授权方法
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(
			PrincipalCollection principals) {
		//从principals获取主身份信息
		//将getPrimaryPrincipal方法返回值转换为真实身份类型,(在doGetAuthenticationInfo认证通过,填充到SimpleAuthenticationInfo中身份信息类型)
		String userCode=(String) principals.getPrimaryPrincipal();
		//根据身份信息,获取权限信息
		//连接数据库。。。
		//模拟从数据库获取到数据
		List<String> permissionList=new ArrayList<String>();
		permissionList.add("user:create");//用户的创建权限
		permissionList.add("items:add");//商品添加权限
		// and so on...
		//查到权限数据,返回授权信息(把上面查询到的数据填充)
		SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
		//将上面查询到的授权信息进行填充
		authorizationInfo.addStringPermissions(permissionList);
		
		return authorizationInfo;
	}
}


ini配置:


[main]
#自定义realm
customRealm=cn.itcast.shiro.realm.CustomRealm
#将realm设置到securityManager
securityManager.realms=$customRealm


测试授权:


/**
	 * 自定义realm进行测试
	 */
	@Test
	public void  testAuthorizationWithCustomRealm(){
		//创建SecurityManager工厂
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");
		//创建SecurityManager
		SecurityManager securityManager=factory.getInstance();
		//将SecurityManager设置到系统运行环境,和spring整合后将SecurityManager配置到spring容器中
		SecurityUtils.setSecurityManager(securityManager);
		//创建subject
		Subject subject=SecurityUtils.getSubject();
		//执行认证
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123");
		try {
			subject.login(token);
		} catch (AuthenticationException e) {
			e.printStackTrace();
		}
		System.out.println("认证状态:"+subject.isAuthenticated());
		
		
		/*基于资源的授权
		 * 
		 * 调用isPermitted方法会调用自定义realm来查询权限数据
		 * */
		boolean isPermitted=subject.isPermitted("user:create:1");
		System.out.println("是否有user:create权限:"+isPermitted);
		boolean isPremittedAll=subject.isPermittedAll("user:create","user:delete");	
		System.out.println("是否有user:create,user:delete权限:"+isPermitted);
		
		//使用无返回值的check
		try {
			subject.checkPermission("user:post");
		} catch (AuthorizationException e) {
			System.out.println("用户没有user:post权限");
			e.printStackTrace();
		}
	}


授权流程:


1、对subject进行授权,调用方法isPermitted("permission串")
2、SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
3、ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据
	调用realm的授权方法:doGetAuthorizationInfo
 
4、realm从数据库查询权限数据,返回ModularRealmAuthorizer
5、ModularRealmAuthorizer调用PermissionResolver进行权限串比对
6、如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常。







目录
相关文章
|
异构计算 存储 虚拟化
看云栖说云栖——神龙、含光、擎天、云超算
说说以神龙为代表的阿里云计算资源
1214 0
|
Java Maven
Maven 依赖管理
Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。
418 5
|
11月前
|
机器学习/深度学习 人工智能 算法
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
X-AnyLabeling是一款集成了多种深度学习算法的图像标注工具,支持图像和视频的多样化标注样式,适用于多种AI训练场景。本文将详细介绍X-AnyLabeling的功能、技术原理以及如何运行该工具。
2795 2
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
|
11月前
|
人工智能 内存技术
Gemini 2.0 Flash Thinking:谷歌推出实验性多模态推理模型,在快速生成的同时展示详细的思考过程
谷歌推出的实验性推理模型Gemini 2.0 Flash Thinking,展示了详细的思考过程,能够在多个领域快速解决问题,并提供推理路径。本文将详细介绍该模型的功能、技术原理及使用限制。
561 26
Gemini 2.0 Flash Thinking:谷歌推出实验性多模态推理模型,在快速生成的同时展示详细的思考过程
|
11月前
|
存储 人工智能 数据管理
|
Linux C++ iOS开发
vs code常见的查找快捷键大全
本文来自 frozencola 技术日志,介绍了 VS Code 中常用的查找快捷键,包括快速打开文件、文件资源管理器、全局搜索、查找符号、查找文件中的文本、查找并替换、文件导航和使用命令面板。掌握这些快捷键可以显著提升开发效率。
987 4
|
安全 数据挖掘 API
快手小店详情API接口的获取与应用
在数字化时代,电商平台竞争激烈,API接口作为连接不同系统和服务的桥梁,已成为电商生态中不可或缺的一部分。本文详细介绍快手小店详情API接口的获取与应用,帮助开发者和企业提升业务效率和用户体验。涵盖API接口定义、主要应用场景、注册与认证流程、调用方法及实际应用案例,提供最佳实践建议。
495 1
|
存储 安全 数据管理
深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?
深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?
301 1
|
Ubuntu 安全 网络协议
Ubuntu设置smb功能
通过以上步骤,您已经在Ubuntu系统上成功设置了SMB共享服务,实现了与不同操作系统间的文件共享。记住,根据实际需求调整配置文件,特别是在安全性方面,比如限制访问权限、使用加密传输等,以确保共享环境既便利又安全。
634 1
|
关系型数据库 MySQL 网络安全
实时计算 Flink版操作报错合集之Debezium引擎因为其他错误而关闭,导致无法检索到引擎的schema历史记录,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。