使用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. delphi FastReport 安装方法

    (最近记忆力真的不行了,装了很多遍,过段时间重装delphi又不记得了,又要折腾,现在先记录下来,留给下次翻) 1.下载安装包,这里提供一个百度云盘共享链接,版本为fastreport5: https ...

  2. 学生信息系统(json模块解决数据持久化)

    将学生管理的案例,学生信息由原来的只有姓名,拓展为包含,姓名,年龄,两个属性:完成对应的增.删.查.改,操作 import json,os,time,sys student_list = [] Fil ...

  3. 在DOS命令行窗口中显示系统环境环境变量

    (这是一个小技巧) 示例命令: echo %path% path是系统环境变量,使用百分号包围起来 http://www.cnblogs.com/danzhang 张洪君 微软ALM MVP

  4. Application可以被重用,从哪里看出来的?

    一开始Context是静态的,并且创建时赋值,然后校验用户访问权限的时候,出现了问题, 调试看到,每次请求的url都一样,我就发现了每次Contetx都是一样的, 说明每次请求的Application ...

  5. python的print()输出

    1.普通的输出: print(str)#str是任意一个字符串,数字··· 2.格式化输出: print('1,2,%s,%d'%('asd',4)) 1,2,asd,4 与C语言有点类似 3.其它: ...

  6. WPF里面多线程访问UI线程、主线程的控件

    如果出现以下错误:调用线程无法访问此对象,因为另一个线程拥有该对象. 你就碰到多线程访问UI线程.主线程的控件的问题了. 先占位.

  7. 基于ASP.NET几十万数据几秒钟就可以导入到数据库中

    /// <summary> /// 一.构建模拟数据存放于DataTable /// </summary> /// <returns>DataTable</r ...

  8. 将实体转换为Hashtable

    1.将实体转换为Hashtable,用于将实体参数处理为hashtable,方便sql参数传递 /// <summary> /// 将实体转换为Hashtable /// </sum ...

  9. 用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建

    一般一个项目开始之前都会有启动会,需求交底等等,其中会有一个环节,大讲特讲项目的意义,然后取一个高大上的项目名字,咱这是一个小功能谈不上项目,但是名字不能太小气了.好吧,就叫Trump吧.没有任何含义 ...

  10. java 基础解析

    http://www.cnblogs.com/-new/tag/java%E5%9F%BA%E7%A1%80%E8%A7%A3%E6%9E%90/