Shiro Realm
Realm:
在实际应用中,shiro从数据库中获取安全数据(如用户、角色、权限),而不是从ini中,可作为安全数据源
即SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法
也需要从Realm中得到用户相应的角色/权限以确定用户是否能进行操作
org.apache.shiro.realm.Realm:
String getName(); //返回一个唯一的Realm名字
boolean supports(AuthenticationToken token); //判断此Realm是否支持此Token
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException; //根据Token获取认证信息
1 自定义Realm:
一般实现AuthorizingRealm(授权)接口即可,此接口继承了AuthenticatingRealm(身份验证),也简介集成了CachingRealm(缓存)接口
ini配置指定自定义Realm
[main]
#自定义realm
customRealm=com.roxy.shiro.realm.CustomRealm
#指定secrityManager的Realm实现
securityManager.realm=$customRealm
realm:
public class CustomRealm extends AuthenticatingRealm{
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 从数据库获取用户名和密码
String username = "draco";
String password = "615";
//从用户的输入中生成token,拿到用户名密码
String inputUsername = (String)token.getPrincipal();
if(!inputUsername.equals(username)){
throw new UnknownAccountException("用户不存在");
}
/* if(status == 0){
throw new LockedAccountException("用户被锁定");
}*/
String inputPassword = (String)token.getCredentials();
if(!inputPassword.equals(password)){
throw new IncorrectCredentialsException("密码不正确");
}
System.out.println(this.getName());
String realName = this.getName();
//拿到授权信息
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(inputUsername, inputPassword, realName);
return info;
}
}
测试出现错误:
错误信息提示类型转换错误,猜测username或者password的类型转换出错,但是日志已经将username打印出来,所以password转换出错
2017-10-14 20:24:34,680 WARN [org.apache.shiro.authc.AbstractAuthenticator] -
Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - draco, rememberMe=false].
Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
java.lang.ClassCastException: [C cannot be cast to java.lang.String
将代码改为:
String inputPassword = new String((char[])token.getCredentials());
再次测试:
2017-10-14 20:28:41,793 DEBUG [com.roxy.shiro.quickstart.Quickstart] - 密码错误
2017-10-14 20:28:41,794 DEBUG [com.roxy.shiro.quickstart.Quickstart] - 是否登陆成功:false
2 多Realm配置:
[main]
#自定义realm
customRealm=com.roxy.shiro.realm.CustomRealm
customRealm2=com.roxy.shiro.realm.CustomRealm2
#指定secrityManager的Realm实现 (可选,若不指定,按照声明的顺序进行使用)
securityManager.realm=$customRealm,$customRealm2
SecurityManager会按照Realms指定的顺序进行身份验证
如果Realm没有被显示的指定,则会被忽略
Shiro Realm的更多相关文章
- 解决自定义Shiro.Realm扩展类不能用注解(@Resource或@Autowire)自动装配的问题
问题产生原因:加载Realm时其他Spring配置文件(xml)尚未加载,导致注入失败. 解决方法:编写一个设置类把注入工作提前完成. package com.xkt.shiro import org ...
- org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set. Authorization cache cannot be obtained.
项目中用spring shiro来处理权限的问题,但是启动的时候会打印如下日志 org.apache.shiro.realm.AuthorizingRealm - No cache or cacheM ...
- Java-Shiro(五):Shiro Realm讲解(二)IniRealm的用法、JdbcRelam的用法、自定义Realm
引入 上一篇在讲解Realm简介时,介绍过Realm包含大概4类缺省的Realm,本章主要讲解: 1)IniRealm的用法: 2)JdbcRealm基于mysql 默认表及查询语句实现认证.授权 ...
- shiro realm 注解失败问题解决过程
做为一名在.net混了八九年的老兵油子,转战java时间并不长,刚开始做项目完全是凭借对C#的认识来做,虽然遇到一些问题,但实际结果显示C#在语言上和java还是有很大相似度,而且微软的MVC与Spr ...
- 第六章:shiro Realm相关对象
Shiro 中的 AuthenticationToken AuthenticationToken 用于收集用户提交的身份(如用户名)及凭据(如密码).Shiro会调用CredentialsMatche ...
- 30、shiro框架入门2,关于Realm
1.Jdbc的Realm链接,并且获取权限 首先创建shiro-jdbc.ini的配置文件,主要配置链接数据库的信息 配置文件中的内容如下所示 1.变量名=全限定类名会自动创建一个类实例 2.变量名. ...
- 权限框架 - shiro 自定义realm
上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...
- Shiro源码分析-初始化-Realm
在上一篇介绍SecurityManager的初始化过程中,也有realm的粗略介绍. realm的概念在安全领域随处可见: 各种中间件的realm.spring security的realm.shir ...
- shiro(二)自定义realm,模拟数据库查询验证
自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...
随机推荐
- oracle-pl/sql之一
http://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html#_Toc15837 SQL语言只是访问.操作数据库的语言,并不是一种具有流程 ...
- 24 正则表达式 re模块
一.正则表达式 1.字符组 ① [abc] 匹配a或b或c ② [a-z] 匹配a到z之间的所有字⺟ [0-9]匹配所有阿拉伯数字 2.元字符 3.量词 4.重要搭配 ① .*? ② .*?x ...
- 简单的user-based协同过滤算法示例代码
#构造一份打分数据集1 users = {"小明": {"中国合伙人": 5.0, "太平轮": 3.0, "荒野猎人" ...
- C# Json数组序列化和反序列总结
1.创建json数组,例: JArray arrFile = new JArray(); arrFile.Add(new JObject() { new JProperty("FilePat ...
- Jmeter JDBC Request--测试数据库连接 拒绝解决方案
有时会遇到回应信息如下: 1 Cannot create PoolableConnectionFactory (Access denied for user 'root'@'10.0.1.23' (u ...
- golang bug Unknown load command 0x32 (50)
问题 编译文件时报错: /usr/local/go/pkg/tool/darwin_amd64/link: /usr/local/go/pkg/tool/darwin_amd64/link: comb ...
- windbg 如何再内核模式调试用户空间的程序
1:使用!process 0 0 获取用户空间的所有的进程的信息 !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS 80a02a60 ...
- 三重DEC加密在java中的实现
代码可以直接拷走使用,一些约定例如向量可以自行变动 引言 如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android.ios.java平台 ...
- SpringBoot+Maven 多模块项目的构建、运行、打包
SpringBoot+Maven 多模块项目的构建.运行.打包 https://blog.csdn.net/zekeTao/article/details/79413919
- MySQL5.7 GTID 浅析
https://yq.aliyun.com/articles/68441 摘要: # GTID 简介 GTID (global transaction identifier)在MySQL5.6时引入, ...