6、Shiro之自定义realm
1、创建一个包存放我们自定义的realm文件:
创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写:
CustomRealm代码:
- package com.shiro.myrealm;
- import org.apache.shiro.authc.AuthenticationException;
- import org.apache.shiro.authc.AuthenticationInfo;
- import org.apache.shiro.authc.AuthenticationToken;
- import org.apache.shiro.authc.SimpleAuthenticationInfo;
- import org.apache.shiro.authz.AuthorizationInfo;
- import org.apache.shiro.authz.SimpleAuthorizationInfo;
- import org.apache.shiro.crypto.hash.Hash;
- import org.apache.shiro.realm.AuthorizingRealm;
- import org.apache.shiro.subject.PrincipalCollection;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Map;
- import java.util.Set;
- public class CustomRealm extends AuthorizingRealm {
- //认证方法
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
- /**
- * 重写认证方法
- */
- //1、从主体传过来的认证信息中获取用户名
- String username = (String) authenticationToken.getPrincipal();
- //2、通过用户名到数据库获取凭证
- String password = getPassWordByUsername(username);
- if (password == null) {
- return null;
- }
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo("miyue", password, "test");
- return simpleAuthenticationInfo;
- }
- //授权方法
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
- /**
- * 重新授权方法
- */
- String username = (String) principalCollection.getPrimaryPrincipal();
- //从角色和缓存中获取角色数据
- Set<String> roles = getRolesByUsername(username);
- //从角色和缓存中获取权限数据
- Set<String> permission = getPermissionsByUsername(username);
- SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo();
- simpleAuthorizationInfo.setRoles(roles);
- simpleAuthorizationInfo.setStringPermissions(permission);
- return simpleAuthorizationInfo;
- }
- //下面使用map,set模拟数据库数据返回
- Map<String, String> map = new HashMap<String, String>();
- {
- map.put("miyue", "houru");
- }
- private String getPassWordByUsername(String username) {
- return map.get(username) == null ? null : map.get(username);
- }
- private Set<String> getRolesByUsername(String username) {
- Set<String> set = new HashSet<>();
- set.add("admin");
- set.add("user");
- return set;
- }
- private Set<String> getPermissionsByUsername(String username) {
- Set<String> set = new HashSet<>();
- set.add("user:delete");
- set.add("user:add");
- return set;
- }
- }
新建一个测试类MyrealmTest,测试我们自定义的realm:
- package com.shiro.shiroframe;
- import com.shiro.myrealm.CustomRealm;
- import org.apache.shiro.SecurityUtils;
- import org.apache.shiro.authc.UsernamePasswordToken;
- import org.apache.shiro.mgt.DefaultSecurityManager;
- import org.apache.shiro.subject.Subject;
- import org.junit.jupiter.api.Test;
- public class MyrealmTest {
- //引入我们自定义的realm
- CustomRealm customRealm = new CustomRealm();
- @Test
- public void MyrealmTest() {
- DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
- defaultSecurityManager.setRealm(customRealm);
- SecurityUtils.setSecurityManager(defaultSecurityManager);
- Subject subject = SecurityUtils.getSubject();
- UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("miyue", "houru");
- subject.login(usernamePasswordToken);
- System.err.println(subject.isAuthenticated());
- subject.checkRoles("admin");
- subject.checkPermission("user:add");
- }
- }
上面测试类,验证通过,则控制台不报错,否则报错;
6、Shiro之自定义realm的更多相关文章
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- shiro(二)自定义realm,模拟数据库查询验证
自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...
- shiro之自定义realm
Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...
- Shiro -- (三) 自定义Realm
简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
先来看问题 纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...
- (十)shiro之自定义Realm以及自定义Realm在web的应用demo
数据库设计 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...
- 权限框架 - shiro 自定义realm
上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
随机推荐
- 采购合同的条件价格取值逻辑(如ME35K/ME3M显示报表的多个日期范围的条件价格)
1.根据采购订单合同和行项目和类型(合同是M)在A016表中取值条件号, 2.根据A016的条件号在KONP中取得价格 ME35K.ME3M的增强点在子程序LMEREPI02下的 METHOD if ...
- 查看 php 编译参数
/app/php/bin/php -i|grep configure 范例 4: [root@VM-001 ~]# /app/php/bin/php -i|grep configure Configu ...
- EFCore, 输出执行的Sql语句到控制台或者调试窗口
.net core 已经集成的各种日志功能,使用efcore时,只需要按情况引入相应的包即可,如果你用的是.net core调试,那么可以引入 Microsoft.Extensions.Logging ...
- ACM常用之 异或运算的性质。
- java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝
今天开始写一些高并发实战系列. 本系列主要讲两大主流框架: Netty和Quasar(java纤程库) 先介绍netty吧,netty是业界比较成熟的高性能异步NIO框架. 简单来说,它就是对NIO2 ...
- 安装kibana可视化平台工具
1.安装kibana 命令: wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.0-linux-x86_64.tar.gz ...
- Codeforces Round #605 (Div. 3) 比赛总结
比赛情况 2h才刀了A,B,C,D.E题的套路做的少,不过ygt大佬给我讲完思路后赛后2min就AC了这题. 比赛总结 比赛时不用担心"时间短,要做多快",这样会匆匆忙忙,反而会做 ...
- bootstrap-table给每一行数据添加按钮,并绑定事件
https://blog.csdn.net/mht1829/article/details/72633100 https://blog.csdn.net/qq_39215166/article/det ...
- ZROI 19.08.02 计算几何
1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识 ...
- java初学者的Springmvc04笔记
Springmvc04 Springmvc的全局异常处理 springmvc与spring的整合 myBatis 1.Springmvc的全局异常处理 作用:一次配置,对于controller层的所有 ...