【单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的更多相关文章

  1. 权限框架 - shiro 自定义realm

    上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...

  2. Shrio认证详解+自定义Realm

    Authentication(身份认证)是Shiro权限控制的第一步,用来告诉系统你就是你. 在提交认证的时候,我们需要给系统提交两个信息: Principals:是一个表示用户的唯一属性,可以是用户 ...

  3. Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】

    什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...

  4. shiro(二)自定义realm,模拟数据库查询验证

    自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...

  5. shiro自定义Realm

    1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...

  6. Shiro入门 - 通过自定义Realm连数数据库进行授权

    shiro-realm.ini [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Spring中的注 ...

  7. Shiro入门 - 通过自定义Realm连数数据库进行认证(md5+salt形式)

    shiro-realm-md5.ini [main] #定义凭证匹配器 credentialsMatcher=org.apache.shiro.authc.credential.HashedCrede ...

  8. Shiro入门 - 通过自定义Realm连数数据库进行认证

    添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...

  9. shiro教程2(自定义Realm)

    通过shiro教程1我们发现仅仅将数据源信息定义在ini文件中与我们实际开发环境有很大不兼容,所以我们希望能够自定义Realm. 自定义Realm的实现 创建自定义Realmjava类 创建一个jav ...

  10. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

随机推荐

  1. libnids TCP数据流重组,显示TCP连接过程的程序总无法捕获数据包解决办法:

      法一: 指定可用网卡: nids_params.device="lo"; 法二: nids.h中有这么一段: struct nids_chksum_ctl { u_int ne ...

  2. angularJs模版注入的两种方式

    一,声名式注入 1:app.js: var myApp = angular.module("myApp",["ngRoute"]); 2:controller. ...

  3. SQL Server 方言类型映射问题

    关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取

  4. codeforces 402E - Strictly Positive Matrix【tarjan】

    首先认识一下01邻接矩阵k次幂的意义:经过k条边(x,y)之间的路径条数 所以可以把矩阵当成邻接矩阵,全是>0的话意味着两两之间都能相连,也就是整个都要在一个强连通分量里,所以直接tarjan染 ...

  5. JS制作一个创意数字时钟

    通过js代码制作一个创意数字时钟 通过JS代码实现创意数字时钟效果如下:由数字化的卡通形象图片取代常规的数字显示当前实时北京时间.具体效果示例: 核心重点: (1)Date方法的初步了解 (2)构建模 ...

  6. JavaScript编程艺术-第10章-10.2-实用的动画

    10.2-实用的动画 ***代码亲测可用*** HTML: <!DOCTYPE HTML> <html> <head> <meta charset=" ...

  7. 网络爬虫之scrapy框架(CrawlSpider)

    一.简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能之外,还派生了其自己独有的更强大的特性和功能.其中最显著的功能就是"LinkExtractor ...

  8. [译]Cookies Without Chocolate Chips

    Cookies Without Chocolate Chips In the HTTP sense, a cookie is a name with an associated value. A se ...

  9. TFS修改了工作区

    计算机修改名字后,更换了TFS工作区,但原工作区的有些文件忘记签入: 解决方案: 删除原工作区即可,实现:到TFS工作区 - “管理工作区”,选中“显示远程工作区”,找到原工作区,删除即可.

  10. 读《实战GUI产品的自动化测试》:第一步——了解自动化测试,简单RFT的录制回放实例

    1.了解自动化测试,什么是自动化测试?(可以参数百度百科“自动化测试”) 2.了解自动化测试 * 自动化测试如何改善产品的质量 * 自动化测试无法完全替代手工测试 * 自动化测试无法发现新的问题——适 ...