使用shiro框架来完成认证工作,默认是iniRealm,如果需要使用其他的realm,需要配置。

ini配置文件详解,官方文档的说明如下:

[main] section 是你配置应用程序的 SecurityManager 实例及任何它的依赖组件(如 Realms)的地方。

在[main]里 使用 键/值对 配置对象实例,如 SecurityManager 或任何它的依赖组件,如自定义的realm。

如自定义一个realm,然后注入给SecurityManager:

注:(在SecurityManager的实现类RealmSecurityManager中就可以setRealm)

[main]
myRealm=com.lhy.realm.MyRealm
#依赖注入(类似spring)通过$引用
securityManager.realm=$myRealm

上边的配置就会创建id为myRealm的对象,然后把它赋给SecurityManager,类似spring的依赖注入

[users] section 允许你定义一组静态的用户帐户。这在大部分拥有少数用户帐户或用户帐户不需要在运行时被动态地
创建的环境下是很有用的。

[users]
zhangsan=1111
lisi=1111,role1,role2

[roles] section 允许你把定义在[users] section 中的角色与权限关联起来。另外,这在大部分拥有少数用户帐户或用户帐户不需要在运行时被动态地创建的环境下是很有用的

[users]
zhangsan=123,role1
[roles]
role1=user:add,user:delete #role1是对user有add和delete权限

规则:“用户名=密码,角色1,角色2”“角色=权限1,权限2”,即首先根据用户名找到角色,然后根据角色再找到权限;即角色是权限集合;Shiro同样不进行权限的维护,需要我们通过Realm返回相应的权限信息。只需要维护“用户——角色”之间的关系即可。

2,使用JdbcRealm来完成身份认证

通过观察JdbcRealm可知,要实现jdbcRealm:

a)需要为jdbcRealm设置dataSource

b)在指定的dataSource所对应的数据库表中有用户表users,该表中有username,password,password_salt (盐)等字段。

=================================================================================

shiro.ini配置文件:使用c3p0数据库连接池,注意c3p0和mysql驱动版本的匹配,mysql驱动版本不能太高,否则会报错的。我第一次使用的驱动是6.X的就报错说不匹配!


[main]
#配置数据源,使用c3p0连接池
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
dataSource.user=root
dataSource.password=root
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#依赖注入,$表示引用对象
jdbcRealm.dataSource=$dataSource
securityManager.realm=$jdbcRealm

 

新建数据库shiro,新建表users:并建立username,password,password_salt字段

还是使用maven项目,添加c3p0,mysql的依赖:

    <dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>

新建测试类  JdbcRealm.java:

package com.lhy.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory; public class JdbcRealmDemo { public static void main(String[] args) {
//1,创建SecurityManager工厂 读取shiro配置文件
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2 通过securityManager工厂获取SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//3 将SecurityManager 对象设置到运行环境
SecurityUtils.setSecurityManager(securityManager);
//4 通过SecurityUtils获取主体subject
Subject subject = SecurityUtils.getSubject();
try {
//5.假设登录名是zhangsan 密码是1111
UsernamePasswordToken token = new UsernamePasswordToken("niubei","1111");
//6,登录,进行用户身验证
subject.login(token);
//通过subject判断用户是否通过验证
if(subject.isAuthenticated()){
System.out.println("用户登录成功!");
}
} catch (UnknownAccountException e) {
System.out.println("用户名或密码错误!");
e.printStackTrace();
}catch (IncorrectCredentialsException e) {
System.out.println("用户名或密码错误!");
e.printStackTrace();
}
//其他异常处理。。。
//7 退出
subject.logout(); }
}

shiro.ini里配置的是jdbcRealm,认证器就会调用jdbcRealm

认证策略:AuthenticationStrategy

当一个应用程序配置了两个或两个以上的 Realm 时,ModularRealmAuthenticator 依靠内部的AuthenticationStrategy 组件来确定这些认证尝试的成功或失败条件。

shiro有三种认证策略:

默认是第一个策略。

subject.login(token)的执行过程,查看源代码:

可知,subject.login(token)调用的是Subject接口的实现类DelegatingSubject的login方法,再查看securityManager.login(this,token):

调用的是SecurityManager的实现类,DefaultSecurityManager的login方法。间接地调用的是其父类AuthenticatingSecurityManager的方法authenticate(token)将token传给认证器

查看上图箭头所指的认证器,是AuthenticatingSecurityManager的一个属性,这个就是认证器接口

shiro所用的就是认证器的实现类ModularRealmAuthenticator。查看这个实现类可知,里边就有一个认证策略接口,默认策略是AtLeastOneSuccessfulStrategy

查看认证策略的类关系可知,他有三个认证策略。

======================================================================

修改默认的认证策略,实验多Realm思路:ini配置文件里把数据源copy一份,模拟两个数据源:

[main]
#数据库连接池
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
dataSource.user=root
dataSource.password=root
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#依赖注入 $表示引用对象
jdbcRealm.dataSource=$dataSource
#配置验证器
authcStrategy = org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
#####################第二个数据源,一个数据源把这部分删除############
dataSource1=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource1.driverClass=com.mysql.jdbc.Driver
dataSource1.jdbcUrl=jdbc:mysql://localhost:3306/shiro1
dataSource1.user=root
dataSource1.password=root
jdbcRealm1=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm1.dataSource=$dataSource1
##################################################################
securityManager.realms=$jdbcRealm
securityManager.authenticator.authenticationStrategy = $authcStrategy

然后再新建一个数据库shiro1,新建users表进行试验。在此我就不做实验了。用到了再说。

shiro学习笔记_0300_jdbcRealm和认证策略的更多相关文章

  1. Shiro学习笔记总结,附加" 身份认证 "源码案例(一)

    Shiro学习笔记总结 内容介绍: 一.Shiro介绍 二.subject认证主体 三.身份认证流程 四.Realm & JDBC reaml介绍 五.Shiro.ini配置介绍 六.源码案例 ...

  2. shiro学习笔记_0600_自定义realm实现授权

    博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...

  3. Shiro学习笔记(5)——web集成

    Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...

  4. Shiro 学习笔记(一)——shiro简介

    Apache Shiro 是一个安全框架.说白了,就是进行一下 权限校验,判断下这个用户是否登录了,是否有权限去做这件事情. Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与web 集成. ...

  5. shiro学习笔记 (一)shiro的简介

    shirio的功能 Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境.Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等 ...

  6. Shiro学习笔记(二)

    首先还是先搭建工程运行环境  依旧搭建的是Maven工程,如果不是Maven 也可以去网上找jar包然后导入 (我使用Maven主要是找依赖配置文件就行,我自己导jar包的时候就是很容易报错) 还是先 ...

  7. MVC4学习笔记之--身份认证过滤器

    过滤器作为MVC模式中面向切面编程应用很广泛,例如身份验证,日志,异常,行为截取等.博客园里面的大神对应过滤器的介绍以及很多,MVC4中不同的过滤器也介绍得很清楚.FlyDragon  辉太 禁止吸烟 ...

  8. Shiro学习笔记 三(认证授权)

    第一种首先基于角色的权限控制 1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类 还是首先看一下目录结构 主要用到文件 首先贴一下工具类的方法 pa ...

  9. shiro学习笔记_0400_自定义realm实现身份认证

     自定义Realm实现身份认证 先来看下Realm的类继承关系: Realm接口有三个方法,最重要的是第三个方法: a) String getName():返回此realm的名字 b) boolean ...

随机推荐

  1. leetcode-8-String to Integer (atoi) (已总结)

    8. String to Integer (atoi) Total Accepted: 93917 Total Submissions: 699588 Difficulty: Easy Impleme ...

  2. Low-level Thinking in High-level Shading Languages

    因为要反汇编shader代码,所以google了数学函数_sat的知识,发现了一些高级着色语言的优化相关的问题.Low-level Thinking in High-level Shading Lan ...

  3. 深度学习之TensorFlow的介绍与安装

    TensorFlow是一个采用数据流图(data flow graphs)用于数值计算的开源软件库.它最初是由Google大脑小组的研发人员设计开发的,用于机器学习和神经网络方面的研究.但是这个系统的 ...

  4. TSQL--聚合函数

    --======================================================== --COUNT --COUNT(1) 和COUNT(*) 计算结果相同,COUNT ...

  5. java多线程 基础demo

    join()   让主进程等待子进程全部执行完 例子如下:   package mocker; public class TestThread5 extends Thread {      priva ...

  6. echarts重绘

    myChart.setOption(option,true); //true重绘

  7. asp:Repeater数据源为空时处理方式

    当Repeater的数据源为空时,会显示空白,界面不友好,以下方式可以简单处理. <asp:repeater runat="server" id="rplist2& ...

  8. python--中的文件操作

    1.文件操作 把文件打开 open 打开 f = open ('文件路径',mode='模式',encoding='编码格式') #打开一个文件操作的时候取到的是一个句柄 读取的方法 . read() ...

  9. P5277 【模板】多项式开根(加强版)(bsgs or Cipolla)

    题面 传送门 题解 首先你得会多项式开根->这里 其次你得会解形如 \[x^2\equiv a \pmod{p}\] 的方程 这里有两种方法,一个是\(bsgs\)(这里),还有一种是\(Cip ...

  10. Python Pymongo中Connection()与MongoClient()差异

    在git找了几个blog的源码,在学习的过程中,发现有人使用Connection(),有人却在使用MongoClient(),那么到底两者有什么差别呢? 且看分析如下: db = Connection ...