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

相关文章

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。