【Shiro】05 自定义Realm认证实现
【前提情要】
Shiro默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,
大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。
根接口:Realm
public interface Realm
缓存处理:CachingRealm
public abstract class CachingRealm implements Realm, Nameable, CacheManagerAware, LogoutAware
认证处理:AuthenticationRealm
public abstract class AuthenticatingRealm extends CachingRealm implements Initializable
授权处理:AuthorizingRealm
public abstract class AuthorizingRealm extends AuthenticatingRealm implements Authorizer, Initializable, PermissionResolverAware, RolePermissionResolverAware
我们自定义Realm是继承AuthorizingRealm来实现:
package cn.echo42.shiro; 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.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; /**
* @author DaiZhiZhou
* @file Shiro
* @create 2020-08-01 18:38
*/
public class UserRealm extends AuthorizingRealm { protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
} protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 通过提交的令牌获取信息(用户名称?)
String principal = authenticationToken.getPrincipal().toString(); // 或者是业务层调取记录对象用来验证 User user=userService.queryUserByUserName(username); // 如果这里从数据库获取的用户名核对成功 返回一个简单的验证结果对象 // 用户名,令牌凭证(就是密码),和这个类的限定名
if ("username".equals(principal)) return new SimpleAuthenticationInfo(principal, authenticationToken.getCredentials(), this.getName()); // 否则返回空,表明查不到
return null;
}
}
然后更改我们的shiro.ini配置:
[main]
#创建userRealm对象
userRealm=com.sxt.realm.UserRealm
#把当前对象给安全管理器
#securityManager=org.apache.shiro.mgt.DefaultSecurityManager
securityManager.realm=$userRealm
测试类实现:
public static void main(String[] args) {
log.info("My First Apache Shiro Application");
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(new UserRealm());
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
AuthenticationToken userToken = new UsernamePasswordToken(username,password);
subject.login(userToken);
// 通过或者异常处理
}
【AuthenticationException体系】
AuthenticationException 异常是Shiro在登录认证过程中,认证失败需要抛出的异常。 AuthenticationException包含以下子类:
CredentitalsException 凭证异常
IncorrentCredentialsException 不正确的凭证
ExpiredCredentialsException 凭证过期 AccountException 账号异常
ConcurrentAccessException 并发访问异常(多个用户同时登录时抛出)
UnknownAccountException 未知的账号
ExcessiveAttemptsException 认证次数超过限制
DisabledAccountException 禁用的账号
LockedAccountException 账号被锁定
UnsupportedTokenException 使用了不支持的Token
【Shiro】05 自定义Realm认证实现的更多相关文章
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- shiro自定义realm认证(五)
上一节介绍了realm的作用: realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null.token就相当于是对用户输入 ...
- 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 获取相应的用户进行比较以确定 ...
- 6、Shiro之自定义realm
1.创建一个包存放我们自定义的realm文件: 创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写: CustomRea ...
- 使用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 ...
随机推荐
- DS Record
八云蓝自动机 Ⅰ 首先我们对于操作 \(1\) 转换,我们给 \(k\) 单独再开一个点 \(a_c\),这样我们就可以把操作 \(1\) 转换成操作 \(2\) 了. 对于区间问题,我们考虑使用莫队 ...
- C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证
C#.NET根据不同业务类别类型写入不同文件中,动态创建log4net实例验证 参考了:https://www.cnblogs.com/-dawn/p/8598566.html GetLog4netI ...
- NumPy 差分、最小公倍数、最大公约数、三角函数详解
NumPy 差分 离散差分意味着相邻元素之间的减法. 例如,对于 [1, 2, 3, 4],离散差分将是 [2-1, 3-2, 4-3] = [1, 1, 1] 要找到离散差分,使用 diff() 函 ...
- uniapp ios 白屏
这个问题找了两天,问题出现的很离谱代码编译没问题,安卓.ios真机运行也没问题,打包以后安卓没问题,iphone 12(ios16.6.1)安装也没问题,还有一个iphone 6s(ios14.7.1 ...
- Docker安装mysql配置my.cnf并挂载到外部机器
1.环境准备,创建外部挂载文件夹conf,data,log mkdir -p /data/dockerdata/mysql3306/{conf,data,log} 2.在/data/dockerdat ...
- Nuxt 3组件开发与管理
title: Nuxt 3组件开发与管理 date: 2024/6/20 updated: 2024/6/20 author: cmdragon excerpt: 摘要:本文深入探讨了Nuxt 3的组 ...
- Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端
基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat. vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia ...
- Python_18 unittest和随机数
- 攻防世界——CRYPTO新手练习区解题总结<3>(9-12题)
第九题easychallenge: 下载附件,得到一个后缀为pyc的文件,上网百度一下pyc文件,得知 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变 ...
- debian11安装备忘
1. 网卡驱动 参考网址:如何安装Debian RTL8821CE驱动? 2. 分辨率 貌似还是有点问题,还要进一步研究一下 参考网址:虚拟机中debian11修改控制台(console)分辨率|li ...