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

相关文章

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解