【单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. springboot开发过程中的小坑(持续更新)

    1. 启动的Application必须放到一个package下面,如下: package com.example.kikidemo; import org.springframework.boot.S ...

  2. Java 链式写法

    Java链式写法,子类继承父类的属性,也可以返回子类的对象,只是需要重写基类的Set方法 public class MyLS { public static void main(String[] ar ...

  3. bzoj 1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪【枚举】

    4维枚举平方小于10000的数,相加等于n则ans++ #include<iostream> #include<cstdio> using namespace std; con ...

  4. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  5. 【题解】PIE [POI2015] [P3585]

    [题解]\(PIE\) \([POI2015]\) \([P3585]\) 逼自己每天一道模拟题 传送门:\(PIE\) \([POI2015]\) \([P3585]\) [题目描述] 一张 \(n ...

  6. 51nod 1018 排序

    1018 排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N  ...

  7. 235 Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最近公共祖先

    给定一棵二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 详见:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-s ...

  8. Previous operation has not finished; run 'cleanup' if it was interrupted.SVN报错

    原因: 错误的原因是SVN管理的文件夹改名.删除文件太过频繁,导致有操作挂起了. 解决方式: 1.百度sqlite3.exe并下载. 2.将该文件解压到项目根目录下的.svn文件夹中. 3.打开cmd ...

  9. 解决Unicode编码(&#29848;)

    随着互联网发展,B/S越来越受欢迎 Code编码格式也越来载多, 在大千花花世界 中文在Web显示看似一样但实际编码并不样,导致从页面获取的资料录入到数据库中时 存取的就是Code编码 如:Unico ...

  10. 网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出

    创建一个新网站,一开始没有内容,通常需要抓取其他人的网页内容,一般的操作步骤如下: 根据url下载网页内容,针对每个网页的html结构特征,利用正则表达式,或者其他的方式,做文本解析,提取出想要的正文 ...