Shiro的Jdbc配置和验证策略(二)下

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: Shiro的Jdbc配置和验证策略(二)

三. 认证策略


securityManager 可以配置多个 Realm, 当配置不同Realm, 甚至Realm 是不同的数据库时,那么在验证的时候,以谁为准呢?


这就是验证的策略。


验证策略 AuthenticationStrategy 有三种:


2020051212114121.png


image.png


AtLeastOneSuccessfulStrategy 与 FirstSuccessfulStrategy 的区别是, FirstSuccessfulStrategy 只返回第一条认证通过的信息,


AtLeastOneSuccessfulStrategy则会返回所有认证通过的信息。


下面写一个小例子,进行验证一下。


三.一 创建数据库 shiro1, 里面有一个 users 数据表


20200512121148393.png


注意,用户的密码。


三.二 创建配置文件 jdbcStrategy.ini


[main]
#配置数据源
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
#配置数据库的信息
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro?characterEncoding=utf8
dataSource.user=root
dataSource.password=abc123
#配置 realm
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#配置数据源
jdbcRealm.dataSource=$dataSource
#配置数据源1
dataSource1=com.mchange.v2.c3p0.ComboPooledDataSource
#配置数据库的信息
dataSource1.driverClass=com.mysql.jdbc.Driver
dataSource1.jdbcUrl=jdbc:mysql://localhost:3306/shiro1?characterEncoding=utf8
dataSource1.user=root
dataSource1.password=abc123
#配置 realm
jdbcRealm1=org.apache.shiro.realm.jdbc.JdbcRealm
#配置数据源
jdbcRealm1.dataSource=$dataSource1
#注入多个realm 到securityManager里面
securityManager.realms=$jdbcRealm,$jdbcRealm1
#配置验证器
authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy
#authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
#authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy
securityManager.authenticator.authenticationStrategy=$authenticationStrategy


三.三 测试文件,进行测试


注意,用户名和密码


Shiro 数据库里面, yuejl 的密码是1234, yuezl 的密码是1234


Shiro1 数据库里面, yuejl的密码是12345, yuezl的密码是 1234.


ShiroDemo5.java


package com.yjl.demo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.DisabledAccountException;
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;
/**
 * 
 * @author 两个蝴蝶飞
 * Shiro 的第五个演示文件, 策略
 */
public class ShiroDemo5 {
  public static void main(String[] args) {
    //1. 创建工厂 
    Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:jdbcStrategy.ini");
    //2. 从工厂里面获取 SecurityManager
    SecurityManager securityManager=factory.getInstance();
    //3. 通过工具类设置 securityManager
    SecurityUtils.setSecurityManager(securityManager);
    //4. 获取当前登录的用户
    Subject subject=SecurityUtils.getSubject();
    //5. 拼装用户的身份和密码Token
    //怕乱,不注释写了,后面的程序,只改变这一个 token 代码
    UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 
    //6. 调用 subject 里面的login 方法,进行登录
    try{      
      subject.login(token);
      //7.判断用户是否登录成功
      if(subject.isAuthenticated()){
        System.out.println("用户:"+token.getUsername()+", 登录成功");
      }
    }catch (UnknownAccountException var6) {
            var6.printStackTrace();
            System.out.println("没有此账号");
        } catch (IncorrectCredentialsException var7) {
            var7.printStackTrace();
            System.out.println("密码不正确");
        } catch (DisabledAccountException var8) {
            var8.printStackTrace();
            System.out.println("账户不可用");
        }
  }
}


三.三.一 FirstSuccessfulStrategy 默认策略


1. 如果用户是 yuejl, 1234 的话, shiro 符合,shiro1 不符合, 符合至少一个成功


UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 


运行程序:


20200512121157749.png


2. 如果用户是 yuejl, 12345 的话, shiro 不符合,shiro1 符合,符合至少一个成功


UsernamePasswordToken token=new UsernamePasswordToken("yuejl","12345"); 


运行程序:


20200512121157749.png


3. 如果用户是 yuezl, 1234 的话, shiro 符合,shiro1 符合,符合至少一个成功


UsernamePasswordToken token=new UsernamePasswordToken("yuezl","1234"); 


运行程序:


20200512121202999.png


三.三.二 AtLeastOneSuccessfulStrategy


在 jdbcStrategy.ini 里面,将策略改成 AtLeastOneSuccessfulStrategy


1. 如果用户是 yuejl, 1234 的话, shiro 符合,shiro1 不符合,符合至少一个成功


UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 


运行程序:


20200512121157749.png


2. 如果用户是 yuejl, 12345 的话, shiro 不符合,shiro1 符合,符合至少一个成功


UsernamePasswordToken token=new UsernamePasswordToken("yuejl","12345"); 


运行程序:


20200512121157749.png


3. 如果用户是 yuezl, 1234 的话, shiro 符合,shiro1 符合,符合至少一个成功


UsernamePasswordToken token=new UsernamePasswordToken("yuezl","1234"); 


运行程序:


20200512121202999.png


三.三.三 AllSuccessfulStrategy


在 jdbcStrategy.ini 里面,将策略改成 AllSuccessfulStrategy


1. 如果用户是 yuejl, 1234 的话, shiro 符合,shiro1 不符合,不符合全部成功


UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 


运行程序:


20200512121228777.png


2. 如果用户是 yuejl, 12345 的话, shiro 不符合,shiro1 符合,不符合全部成功


UsernamePasswordToken token=new UsernamePasswordToken("yuejl","12345"); 


运行程序:


20200512121228777.png


3. 如果用户是 yuezl, 1234 的话, shiro 符合,shiro1 符合,符合全部成功


UsernamePasswordToken token=new UsernamePasswordToken("yuezl","1234"); 


运行程序:


20200512121239628.png


策略演示成功 。


本章节代码链接为:


链接:https://pan.baidu.com/s/1u8i2KHx0FuWbAbf4Fuejzg 
提取码:okrl


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
SQL Java 数据库连接
jdbc的执行流程|不同数据库的驱动配置
jdbc的执行流程|不同数据库的驱动配置
|
9月前
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
43 0
|
4月前
|
前端开发 Java BI
Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)
Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)
|
5月前
|
Java 数据库连接 数据库
Flink全托管,holo 库同步到另一个库,报错failed to get user from ak 亲,请问是哪种权限缺失?Flink 配置中使用的是holo. jdbc 的user和password 。
Flink全托管,holo 库同步到另一个库,报错failed to get user from ak 亲,请问是哪种权限缺失?Flink 配置中使用的是holo. jdbc 的user和password 。
42 1
|
5月前
|
Java 关系型数据库 MySQL
|
8月前
|
SQL 算法 Java
Myqsql使用Sharding-JDBC配置详解3
Myqsql使用Sharding-JDBC配置详解3
67 0
|
8月前
|
SQL 算法 Java
Myqsql使用Sharding-JDBC配置详解2
Myqsql使用Sharding-JDBC配置详解2
126 0
|
8月前
|
SQL 监控 算法
Myqsql使用Sharding-JDBC配置详解1
Myqsql使用Sharding-JDBC配置详解1
46 0
|
9月前
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作2
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作2
51 0
|
10月前
|
SQL 算法 Java
springboot中sharding jdbc绑定表配置实战
springboot中sharding jdbc绑定表配置实战