Shiro安全框架第六篇| 自定义的Realm

2024-03-10 02:59

本文主要是介绍Shiro安全框架第六篇| 自定义的Realm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

自定义的Realm

我这里在原来的项目java/com.jiuyue.shiro下新建一个realm包,再建一个ConstomRealm类,继承AuthorizingRealm类,并且实现它的两个抽象方法。

 1public class ConstomRealm extends AuthorizingRealm {2    @Override3    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {4        //在次方法体中实现用户的角色以及权限的人证5        return null;6    }78    @Override9    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
10        //在次方法体中实现用户信息(username,passwprd)的认证
11        return null;
12    }
13}

这里为了演示,直接在ConstomRealm类中,模拟数据库信息存储,没有连接mysql数据库,使用HashMap集合。

1    Map<String,String> userMap = new HashMap<>();
2    {
3        userMap.put("jiuyue","12345");
4        super.setName("costomReal");
5    }

设计一个查询信息的接口,根据用户名返回用户密码,模拟到数据库查询相关用户信息。

1    private String getPasswordByUserName(String userName) {
2        return userMap.get(userName);
3    }

 

接下来在认证方法中实现自定义Realm的认证的代码编写,从主体中获取认证信息用户名,通过用户名过去密码,查询到用户,则返回AuthenticationInfo对象。

 1    @Override2    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {3        //1、从主体中获取认证信息的用户名4        String userName = (String) token.getPrincipal();5        //2、通过用户名获得密码6        String password =  getPasswordByUserName(userName);7        if (password==null){8            return null;9        }
10        //查询到用户,则返回AuthenticationInfo对象
11        SimpleAuthenticationInfo simpleAuthenticationInfo =
12        new SimpleAuthenticationInfo(userName,password,"customReal");
13        return simpleAuthenticationInfo;
14    }

测试代码

 1/**2 * Create bySeptember3 * 2018/10/274 * 14:295 */6public class CostomRealTest {7   @Test8    public void costomRealTest(){9       ConstomRealm constomRealm =new ConstomRealm();
10       //构建SecurityManager环境
11       DefaultSecurityManager defaultSecurityManager =new DefaultSecurityManager();
12
13       //将自定义的constomRealm设置到SecurityManager中
14       defaultSecurityManager.setRealm(constomRealm);
15
16       SecurityUtils.setSecurityManager(defaultSecurityManager);
17       Subject subject = SecurityUtils.getSubject();
18
19       UsernamePasswordToken token =new UsernamePasswordToken("jiuyue","12345");
20       subject.login(token);
21       System.out.println("isAuthenticated:"+subject.isAuthenticated());
22   }
23
24}

下面在doGetAuthorizationInfo(PrincipalCollection principals)实现用户角色权限验证

1    @Override
2    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
3        return null;
4    }

 

首先我们应该模拟数据库,设计查询用户角色,以及权限的接口,这里也是为了方便直接根据认证用户的信息获取用户的角色权限。在这里模拟的是提交的用户是否jiuyue,如果是则具有集合中的权限(相当于数据库中这个用户拥有的权限)。

 1    private Set<String> getPermissionByUserName(String userName) {2        Set<String> sets = new HashSet<>();3        if (userName.equals("jiuyue")) {4            sets.add("user:delete");5            sets.add("user:add");6        }7        return sets;8    }9
10    private Set<String> getRolesByUserName(String userName) {
11        Set<String> sets = new HashSet<>();
12        if (userName.equals("jiuyue")) {
13            sets.add("admin");
14            sets.add("user");
15        }
16        return sets;
17    }

 

权限验证,提交用户的信息与从数据库或者缓存中获取用户角色信息进行比较验证,如果该用户拥有对应权限,则,返回AuthorizationInfo对象。

 1    @Override2    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {34        String userName = (String) principals.getPrimaryPrincipal();5        //从数据库或者缓存中获取用户角色信息6        Set<String> roles = getRolesByUserName(userName);7        System.out.println("UserName:"+userName);89        Set<String> permissions = getPermissionByUserName(userName);
10        SimpleAuthorizationInfo simpleAuthorizationInfo =
11                new SimpleAuthorizationInfo();
12        simpleAuthorizationInfo.setRoles(roles);
13
14        simpleAuthorizationInfo.setStringPermissions(permissions);
15        return simpleAuthorizationInfo;
16    }

测试代码:

 1public class CostomRealTest {2   @Test3    public void costomRealTest(){4       ConstomRealm constomRealm =new ConstomRealm();5       //构建SecurityManager环境6       DefaultSecurityManager defaultSecurityManager =new DefaultSecurityManager();7       defaultSecurityManager.setRealm(constomRealm);89       SecurityUtils.setSecurityManager(defaultSecurityManager);
10
11       Subject subject = SecurityUtils.getSubject();
12
13       UsernamePasswordToken token =new UsernamePasswordToken("jiuyue","12345");
14       subject.login(token);
15
16       System.out.println("sAuthenticated:"+subject.isAuthenticated());
17
18       subject.checkRole("admin");
19
20       subject.checkRoles("user","admin");
21
22       subject.checkPermission("user:add");
23
24   }
25
26}

 

专题链接:

Shiro安全框架第一篇| 什么是Apache Shiro?

Shiro安全框架第二篇| Shiro的整体架构

Shiro安全框架第三篇| Shiro的认证,授权

Shiro安全框架第四篇| Shiro自定义Realm进行认证授权

Shiro安全框架第五篇| 使用JdbcRealm进行认证授权

                   “扫码关注“

这篇关于Shiro安全框架第六篇| 自定义的Realm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792815

相关文章

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal