【单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. 打开mat文件

    点击file目录,选择import data 然后选择所需.mat文件,就可以打开了

  2. mybatis中各种数据的映射类型

    Mybatis对应的java和数据库的数据类型,最后有图片 Mybatis                                  java                          ...

  3. uml图六种箭头的含义(转载)

    在看一些技术博客的时候,经常会见到博客里画上很多uml图.因为经常会被这几种表达关系的箭头搞混,这里我就把常见的6种箭头表达的含义理一下. 泛化 概念:泛化是一种一般与特殊.一般与具体之间关系的描述, ...

  4. Linux day01(一) 创建Linux虚拟机,设置虚拟机默认属性,虚拟机和Xhell建立连接

    一:创建Linux虚拟机步骤: 1. 二:设置虚拟机默认属性 三:虚拟机和Xhell建立连接

  5. java HashMap和LinkedHashMap区别

    我们用的最多的是HashMap,在Map 中插入.删除和定位元素,HashMap 是最好的选择.但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好.如果需要输出的顺序和输入的相同,那么用 ...

  6. 数据结构之动态顺序表(C实现)

    线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...

  7. 377 Combination Sum IV 组合之和 IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  8. js 获取json数组里面数组的长度

    作为一个前端页面开发者第一次处理json数据,遇到了‘js 获取json数组里面数组的长度’?竟然不知道 json没有.length属性(真是要嘲讽下自己),少壮不努力老大徒伤悲啊!以前都是去寻求男朋 ...

  9. mongo 3.4分片集群系列之七:配置数据库管理

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  10. centos如何离线安装部署node&pm2?

    最近我们项目要上即时通讯,因为项目对安全要求比较高,所以选择了即时通讯云服务器yun2win,他们提供了数据服务器让我们自己安装部署.那么问题来了,我们服务器是放在内网,完全无法访问外网,而yun2w ...