自定义Realm
【单Realm】
1) jar包
2) 实现自定义Realm
public class RealmOne implements Realm{
/**
* 获取基本类名
*/
@Override
public String getName() {
// TODO Auto-generated method stub
System.out.println("className:" + this.getClass().getName());
return this.getClass().getName();
} /**
* 判断token是否被支持
*/
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof UsernamePasswordToken;
} /**
* 执行登录验证
*/
@Override
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
//获取用户名
String principal = String.valueOf(token.getPrincipal());
System.out.println("principal = " + principal);
//获取密码 String credentials =String.valueOf((char[])token.getCredentials());
System.out.println("credentials=" + credentials); //验证用户名
if(!"admin".equals(principal))
throw new UnknownAccountException("用户名不存在"); //验证密码
if(!"123".equals(credentials))
throw new IncorrectCredentialsException("密码错误!"); return new SimpleAuthenticationInfo(principal, credentials, this.getName());
}
}
3) 配置shiro
#声明realm
#变量名 = 类全名
realmOne =cn.hl.realm.RealmOne #将realm分配给securityManager的realms属性
#securityManager = SecurityUtils.securityManager
#realms =RealmSecurityManager.realms
#securityManager.realms =$变量名1,$变量名2,......
securityManager.realms=$realmOne
4) 测试
//定义日志对象
private static final transient Logger logger = LoggerFactory.getLogger(TestSingleRealm.class); public static void main(String[] args) {
//1、获取Factory工厂类对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:single-shiro.ini"); //2、通过工厂类获取SecurityManager对象
SecurityManager securityManager = factory.getInstance(); //3、将SecurityManager托管到SecurityUtils进行管理
SecurityUtils.setSecurityManager(securityManager); //4、获取Subject对象
Subject subject = SecurityUtils.getSubject(); //5、通过Subject执行验证
UsernamePasswordToken token = new UsernamePasswordToken("admin", "1234");
try{
subject.login(token);
}
catch(UnknownAccountException ex){
System.out.println("账号不存在");
}
catch(IncorrectCredentialsException ex){
System.out.println("密码错误");
} if(subject.isAuthenticated())
System.out.println("用户登录成功"); //注销用户
subject.logout();
}
【多Realm】
1) 概述
多realm是为了满足不同登录验证方式而提供的,如:帐号、手机、邮箱等。
2) 自定义Realm
/**
* 通过邮件地址和密码进行验证
* @author Terry
*
*/
public class RealmTwo implements Realm{ @Override
public String getName() {
return this.getClass().getName();
} @Override
public boolean supports(AuthenticationToken token) {
return token instanceof UsernamePasswordToken;
} @Override
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
//获取帐号信息
String principal = String.valueOf(token.getPrincipal());
//获取密码
String credentials = String.valueOf((char[])token.getCredentials()); //通过邮件地址进行验证
if(!"admin@163.com".equals(principal))
throw new UnknownAccountException("帐号信息不存在"); if(!"123456".equals(credentials))
throw new IncorrectCredentialsException("密码错误"); return new SimpleAuthenticationInfo(principal,credentials,this.getName());
} }
3) 配置shiro
#声明realm
#变量名 = 类全名
realmOne =cn.hl.realm.RealmOne
realmTwo =cn.hl.realm.RealmTwo #将realm分配给securityManager的realms属性
#多realm情况下执行顺序与配置顺序直接相关
securityManager.realms=$realmOne,$realmTwo
4) 测试
//示例化Logger对象
private static final transient Logger logger = LoggerFactory.getLogger(TestMultiRealm.class); public static void main(String[] args) {
//1、示例化工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:multi-shiro.ini"); //2、示例化SecurityManager对象
SecurityManager securityManager = factory.getInstance(); //3、托管SecurityManager对象
SecurityUtils.setSecurityManager(securityManager); //4、获取Subject对象
Subject subject = SecurityUtils.getSubject(); //5、通过Subject实现用户登录验证
//UsernamePasswordToken token = new UsernamePasswordToken("admin","123");
UsernamePasswordToken token = new UsernamePasswordToken("admin@163.com","123456");
try{
subject.login(token);
}
catch(UnknownAccountException ex){
ex.printStackTrace();
}
catch(IncorrectCredentialsException ex){
ex.printStackTrace();
} if(subject.isAuthenticated())
System.out.println("用户登录成功"); //注销用户
subject.logout();
}
【JdbcRealm】
1) 概述
Shiro框架中默认提供了对数据库的支持,通常我们可以直接配置JdbcRealm来实现使用数据库进行验证。
2) 包
3) 配置shiro
dataSource =com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass =com.mysql.jdbc.Driver
dataSource.jdbcUrl =jdbc:mysql://localhost:3306/qqdb
dataSource.user =root
dataSource.password =123 #配置JdbcRealm
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $dataSource #自定义验证Sql语句
#jdbcRealm.authenticationQuery=select password, password_salt from users where username = ?
jdbcRealm.authenticationQuery=select pwd from account where no=? #自定义角色查询语句
#userRolesQuery = select role_name from user_roles where username = ? #自定义权限查询语句
#permissionsQuery=select role_name from user_roles where username = ? #配置SecurityManager的realms属性
securityManager.realms = $jdbcRealm
4)测试
//示例化Logger对象
private static final transient Logger logger = LoggerFactory.getLogger(TestJdbcRealm.class); public static void main(String[] args) {
//1、示例化工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc-shiro.ini"); //2、示例化SecurityManager对象
SecurityManager securityManager = factory.getInstance(); //3、托管SecurityManager对象
SecurityUtils.setSecurityManager(securityManager); //4、获取Subject对象
Subject subject = SecurityUtils.getSubject(); //5、通过Subject实现用户登录验证
//UsernamePasswordToken token = new UsernamePasswordToken("admin","123");
UsernamePasswordToken token = new UsernamePasswordToken("23456789","123");
try{
subject.login(token);
}
catch(UnknownAccountException ex){
ex.printStackTrace();
}
catch(IncorrectCredentialsException ex){
ex.printStackTrace();
} if(subject.isAuthenticated())
System.out.println("用户登录成功"); //注销用户
subject.logout();
}
表数据:
自定义Realm的更多相关文章
- 权限框架 - shiro 自定义realm
上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...
- Shrio认证详解+自定义Realm
Authentication(身份认证)是Shiro权限控制的第一步,用来告诉系统你就是你. 在提交认证的时候,我们需要给系统提交两个信息: Principals:是一个表示用户的唯一属性,可以是用户 ...
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...
- shiro(二)自定义realm,模拟数据库查询验证
自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
- Shiro入门 - 通过自定义Realm连数数据库进行授权
shiro-realm.ini [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Spring中的注 ...
- Shiro入门 - 通过自定义Realm连数数据库进行认证(md5+salt形式)
shiro-realm-md5.ini [main] #定义凭证匹配器 credentialsMatcher=org.apache.shiro.authc.credential.HashedCrede ...
- Shiro入门 - 通过自定义Realm连数数据库进行认证
添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...
- shiro教程2(自定义Realm)
通过shiro教程1我们发现仅仅将数据源信息定义在ini文件中与我们实际开发环境有很大不兼容,所以我们希望能够自定义Realm. 自定义Realm的实现 创建自定义Realmjava类 创建一个jav ...
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
随机推荐
- E20170606-gg
complete adj. 完整的; 完成的; (用以强调) 完全的; 达到结尾的; vt. 完成,使完满; 完成或结束; 填写(表格); process n. 过程; 工序; 做事方法; 工艺 ...
- bzoj 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚【dp+线段树】
设f[i]为i时刻最小花费 把牛按l升序排列,每头牛能用f[l[i]-1]+c[i]更新(l[i],r[i])的区间min,所以用线段树维护f,用排完序的每头牛来更新,最后查询E点即可 #includ ...
- java 实现word文档在线预览
一.准备工具 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 下载地址:http://www.openoffice.org/download/in ...
- 转】 Kafka文件存储机制那些事
原博文出自于:http://tech.meituan.com/kafka-fs-design-theory.html 感谢! Kafka是什么 Kafka是最初由Linkedin公司开发,是一个 ...
- Kafka~消费的有效期
消息的过期时间 我们在使用Kafka存储消息时,如果已经消费过了,再永久存储是一种资源的浪费,所有,kafka为我们提供了消息文件的过期策略,可以通过配置server.properies来实现# vi ...
- Python的I/O操作
1.读取键盘输入 msg = raw_input("Please enter :") print "you input ",msg #可接受Python表达式作 ...
- JavaScript(第二部分)
一.DOM获取元素节点的子节点 1.getElementsByTagName() 返回当前节点的指定标签名子节点 2.childNodes 表示当前节点的所有子节点 3.firstChild ...
- Android集成微信分享功能应用签名生成方法及分享不生效的问题
通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...
- NoSQL与关系数据库
关系型数据库:完全支持关系代数理论作为基础:有较大的数据规模:固定的数据库模式:查询效率快:强一致性:数据完整性较易实现:扩展性一般:可用性好. NoSQL:部分支持关系代数理论作为基础:有超大数据规 ...
- oracle数据库定时备份
现有需求,设计一批处理文件,实现周一全部备份,周二周三周五周六增量备份,周四周日累计备份.并且每日将上个月本日数据删除(如今日8月7号,则删除7月7号的数据).并将备份压缩以减小所占空间. 思路: 备 ...