1、创建一个包存放我们自定义的realm文件:

创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写:

CustomRealm代码:

  1. package com.shiro.myrealm;
  2.  
  3. import org.apache.shiro.authc.AuthenticationException;
  4. import org.apache.shiro.authc.AuthenticationInfo;
  5. import org.apache.shiro.authc.AuthenticationToken;
  6. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  7. import org.apache.shiro.authz.AuthorizationInfo;
  8. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  9. import org.apache.shiro.crypto.hash.Hash;
  10. import org.apache.shiro.realm.AuthorizingRealm;
  11. import org.apache.shiro.subject.PrincipalCollection;
  12.  
  13. import java.util.HashMap;
  14. import java.util.HashSet;
  15. import java.util.Map;
  16. import java.util.Set;
  17.  
  18. public class CustomRealm extends AuthorizingRealm {
  19. //认证方法
  20. @Override
  21. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
  22. /**
  23. * 重写认证方法
  24. */
  25. //1、从主体传过来的认证信息中获取用户名
  26. String username = (String) authenticationToken.getPrincipal();
  27. //2、通过用户名到数据库获取凭证
  28. String password = getPassWordByUsername(username);
  29. if (password == null) {
  30. return null;
  31. }
  32. SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo("miyue", password, "test");
  33. return simpleAuthenticationInfo;
  34. }
  35.  
  36. //授权方法
  37. @Override
  38. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  39. /**
  40. * 重新授权方法
  41. */
  42. String username = (String) principalCollection.getPrimaryPrincipal();
  43. //从角色和缓存中获取角色数据
  44. Set<String> roles = getRolesByUsername(username);
  45. //从角色和缓存中获取权限数据
  46. Set<String> permission = getPermissionsByUsername(username);
  47. SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo();
  48. simpleAuthorizationInfo.setRoles(roles);
  49. simpleAuthorizationInfo.setStringPermissions(permission);
  50. return simpleAuthorizationInfo;
  51. }
  52.  
  53. //下面使用map,set模拟数据库数据返回
  54. Map<String, String> map = new HashMap<String, String>();
  55.  
  56. {
  57. map.put("miyue", "houru");
  58. }
  59.  
  60. private String getPassWordByUsername(String username) {
  61. return map.get(username) == null ? null : map.get(username);
  62. }
  63.  
  64. private Set<String> getRolesByUsername(String username) {
  65. Set<String> set = new HashSet<>();
  66. set.add("admin");
  67. set.add("user");
  68. return set;
  69. }
  70.  
  71. private Set<String> getPermissionsByUsername(String username) {
  72. Set<String> set = new HashSet<>();
  73. set.add("user:delete");
  74. set.add("user:add");
  75. return set;
  76. }
  77.  
  78. }

新建一个测试类MyrealmTest,测试我们自定义的realm:

  1. package com.shiro.shiroframe;
  2.  
  3. import com.shiro.myrealm.CustomRealm;
  4. import org.apache.shiro.SecurityUtils;
  5. import org.apache.shiro.authc.UsernamePasswordToken;
  6. import org.apache.shiro.mgt.DefaultSecurityManager;
  7. import org.apache.shiro.subject.Subject;
  8. import org.junit.jupiter.api.Test;
  9.  
  10. public class MyrealmTest {
  11. //引入我们自定义的realm
  12. CustomRealm customRealm = new CustomRealm();
  13.  
  14. @Test
  15. public void MyrealmTest() {
  16.  
  17. DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
  18. defaultSecurityManager.setRealm(customRealm);
  19. SecurityUtils.setSecurityManager(defaultSecurityManager);
  20. Subject subject = SecurityUtils.getSubject();
  21. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("miyue", "houru");
  22. subject.login(usernamePasswordToken);
  23. System.err.println(subject.isAuthenticated());
  24. subject.checkRoles("admin");
  25. subject.checkPermission("user:add");
  26. }
  27.  
  28. }

上面测试类,验证通过,则控制台不报错,否则报错;

6、Shiro之自定义realm的更多相关文章

  1. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

  2. shiro(二)自定义realm,模拟数据库查询验证

    自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...

  3. shiro之自定义realm

    Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...

  4. Shiro -- (三) 自定义Realm

    简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...

  5. 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法

    先来看问题    纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...

  6. (十)shiro之自定义Realm以及自定义Realm在web的应用demo

    数据库设计 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  7. 权限框架 - shiro 自定义realm

    上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...

  8. Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】

    什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...

  9. shiro自定义Realm

    1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...

随机推荐

  1. 采购合同的条件价格取值逻辑(如ME35K/ME3M显示报表的多个日期范围的条件价格)

    1.根据采购订单合同和行项目和类型(合同是M)在A016表中取值条件号, 2.根据A016的条件号在KONP中取得价格 ME35K.ME3M的增强点在子程序LMEREPI02下的  METHOD if ...

  2. 查看 php 编译参数

    /app/php/bin/php -i|grep configure 范例 4: [root@VM-001 ~]# /app/php/bin/php -i|grep configure Configu ...

  3. EFCore, 输出执行的Sql语句到控制台或者调试窗口

    .net core 已经集成的各种日志功能,使用efcore时,只需要按情况引入相应的包即可,如果你用的是.net core调试,那么可以引入 Microsoft.Extensions.Logging ...

  4. ACM常用之 异或运算的性质。

  5. java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝

    今天开始写一些高并发实战系列. 本系列主要讲两大主流框架: Netty和Quasar(java纤程库) 先介绍netty吧,netty是业界比较成熟的高性能异步NIO框架. 简单来说,它就是对NIO2 ...

  6. 安装kibana可视化平台工具

    1.安装kibana 命令: wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.0-linux-x86_64.tar.gz   ...

  7. Codeforces Round #605 (Div. 3) 比赛总结

    比赛情况 2h才刀了A,B,C,D.E题的套路做的少,不过ygt大佬给我讲完思路后赛后2min就AC了这题. 比赛总结 比赛时不用担心"时间短,要做多快",这样会匆匆忙忙,反而会做 ...

  8. bootstrap-table给每一行数据添加按钮,并绑定事件

    https://blog.csdn.net/mht1829/article/details/72633100 https://blog.csdn.net/qq_39215166/article/det ...

  9. ZROI 19.08.02 计算几何

    1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识 ...

  10. java初学者的Springmvc04笔记

    Springmvc04 Springmvc的全局异常处理 springmvc与spring的整合 myBatis 1.Springmvc的全局异常处理 作用:一次配置,对于controller层的所有 ...