使用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. tera term通过ttl脚本 自动连接服务器

    在现在的这个公司一直使用tera term来远程连接服务器,感觉很方便,特别是它的ttl脚本配置的自动连接.有时候我们可能无法直接连接到目标服务器,需要通过ssh经过多个中间服务器才能连接到目标服务器 ...

  2. PHP(四)表单的基本处理

  3. VS2017设置默认管理员权限启动

    找到vs安装目录下的:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe 右键- ...

  4. C++创建自己的库文件(dll文件创建和编译)

    创建编译库文件有个好处就是不容易被修改,加密的,方便调用,但是缺点是不容易查看其中的内容,反编译比较麻烦.下面让我们使用VC创建编译自己的库文件吧.常用的函数,不常更改的,应该放到库文件里,所以库文件 ...

  5. .NET基础 (18)特性

    特性1 什么是特性,如何自定义一个特性2 .NET中特性可以在哪些元素上使用3 有哪几种方法可以获知一个元素是否申明某个特性4 一个元素是否可以重复申明同一个特性 特性1 什么是特性,如何自定义一个特 ...

  6. HttpClient Timeout

    1. Overview This tutorial will show how to configure a timeout with the Apache HttpClient 4. If you ...

  7. jenkins启动失败,提示Starting Jenkins Jenkins requires Java8 or later, but you are running 1.7.0

    # 背景 centos安装jenkins后,先启动jenkins服务,结果报错如下: 但自己明明已经安装了java8的 # 解决方法 既然安装了java8的话,那么证明是jenkins启动的是还是用的 ...

  8. C++不存在从std::string转换为LPCWSTR的适当函数

    LPCWSTR是什么类型呢? 看看如何定义的: typedef const wchar_t* LPCWSTR; 顾名思义就是: LPCWSTR是一个指向unicode编码字符串的32位指针,所指向字符 ...

  9. [uwp]数据绑定再学习

    在开始上代码前,先来假设这样一种情形: 出于某些原因,创建一个自定义控件(UserControl),然后为它定义一个依赖属性,这个属性有两个作用,一是调用控件方通过数据绑定技术为它赋值,二是控件内部的 ...

  10. OpenStack 业务链networking-sfc介绍 (2) - 底层原理

    原文链接:https://blog.csdn.net/bc_vnetwork/article/details/65630475 1.  SFC底层实现原理 port chain和ovs driver/ ...