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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 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


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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL Java 数据库连接
jdbc的执行流程|不同数据库的驱动配置
jdbc的执行流程|不同数据库的驱动配置
|
9月前
|
Java 数据库连接 数据库
【YashanDB知识库】WAS配置YashanDB JDBC连接
【YashanDB知识库】WAS配置YashanDB JDBC连接
|
9月前
|
Oracle Java 关系型数据库
【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle
【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle
|
Java 数据库连接 网络安全
springboot使用Pivotal Greenplum JDBC如何进行配置
【5月更文挑战第23天】springboot使用Pivotal Greenplum JDBC如何进行配置
444 6
|
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 。
173 1
|
Java 关系型数据库 MySQL
|
前端开发 Java BI
Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)
Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)
201 0
|
SQL 算法 Java
Myqsql使用Sharding-JDBC配置详解3
Myqsql使用Sharding-JDBC配置详解3
220 0
|
SQL 算法 Java
Myqsql使用Sharding-JDBC配置详解2
Myqsql使用Sharding-JDBC配置详解2
525 0
|
SQL 监控 算法
Myqsql使用Sharding-JDBC配置详解1
Myqsql使用Sharding-JDBC配置详解1
182 0