自定义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的人对连接数据库的一 ...
随机推荐
- libnids TCP数据流重组,显示TCP连接过程的程序总无法捕获数据包解决办法:
法一: 指定可用网卡: nids_params.device="lo"; 法二: nids.h中有这么一段: struct nids_chksum_ctl { u_int ne ...
- angularJs模版注入的两种方式
一,声名式注入 1:app.js: var myApp = angular.module("myApp",["ngRoute"]); 2:controller. ...
- SQL Server 方言类型映射问题
关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取
- codeforces 402E - Strictly Positive Matrix【tarjan】
首先认识一下01邻接矩阵k次幂的意义:经过k条边(x,y)之间的路径条数 所以可以把矩阵当成邻接矩阵,全是>0的话意味着两两之间都能相连,也就是整个都要在一个强连通分量里,所以直接tarjan染 ...
- JS制作一个创意数字时钟
通过js代码制作一个创意数字时钟 通过JS代码实现创意数字时钟效果如下:由数字化的卡通形象图片取代常规的数字显示当前实时北京时间.具体效果示例: 核心重点: (1)Date方法的初步了解 (2)构建模 ...
- JavaScript编程艺术-第10章-10.2-实用的动画
10.2-实用的动画 ***代码亲测可用*** HTML: <!DOCTYPE HTML> <html> <head> <meta charset=" ...
- 网络爬虫之scrapy框架(CrawlSpider)
一.简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能之外,还派生了其自己独有的更强大的特性和功能.其中最显著的功能就是"LinkExtractor ...
- [译]Cookies Without Chocolate Chips
Cookies Without Chocolate Chips In the HTTP sense, a cookie is a name with an associated value. A se ...
- TFS修改了工作区
计算机修改名字后,更换了TFS工作区,但原工作区的有些文件忘记签入: 解决方案: 删除原工作区即可,实现:到TFS工作区 - “管理工作区”,选中“显示远程工作区”,找到原工作区,删除即可.
- 读《实战GUI产品的自动化测试》:第一步——了解自动化测试,简单RFT的录制回放实例
1.了解自动化测试,什么是自动化测试?(可以参数百度百科“自动化测试”) 2.了解自动化测试 * 自动化测试如何改善产品的质量 * 自动化测试无法完全替代手工测试 * 自动化测试无法发现新的问题——适 ...