三. 认证策略
securityManager 可以配置多个 Realm, 当配置不同Realm, 甚至Realm 是不同的数据库时,那么在验证的时候,以谁为准呢?
这就是验证的策略。
验证策略 AuthenticationStrategy 有三种:
AtLeastOneSuccessfulStrategy 与 FirstSuccessfulStrategy 的区别是, FirstSuccessfulStrategy 只返回第一条认证通过的信息,
AtLeastOneSuccessfulStrategy则会返回所有认证通过的信息。
下面写一个小例子,进行验证一下。
三.一 创建数据库 shiro1, 里面有一个 users 数据表
注意,用户的密码。
三.二 创建配置文件 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");
运行程序:
2. 如果用户是 yuejl, 12345 的话, shiro 不符合,shiro1 符合,符合至少一个成功
UsernamePasswordToken token=new UsernamePasswordToken("yuejl","12345");
运行程序:
3. 如果用户是 yuezl, 1234 的话, shiro 符合,shiro1 符合,符合至少一个成功
UsernamePasswordToken token=new UsernamePasswordToken("yuezl","1234");
运行程序:
三.三.二 AtLeastOneSuccessfulStrategy
在 jdbcStrategy.ini 里面,将策略改成 AtLeastOneSuccessfulStrategy
1. 如果用户是 yuejl, 1234 的话, shiro 符合,shiro1 不符合,符合至少一个成功
UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234");
运行程序:
2. 如果用户是 yuejl, 12345 的话, shiro 不符合,shiro1 符合,符合至少一个成功
UsernamePasswordToken token=new UsernamePasswordToken("yuejl","12345");
运行程序:
3. 如果用户是 yuezl, 1234 的话, shiro 符合,shiro1 符合,符合至少一个成功
UsernamePasswordToken token=new UsernamePasswordToken("yuezl","1234");
运行程序:
三.三.三 AllSuccessfulStrategy
在 jdbcStrategy.ini 里面,将策略改成 AllSuccessfulStrategy
1. 如果用户是 yuejl, 1234 的话, shiro 符合,shiro1 不符合,不符合全部成功
UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234");
运行程序:
2. 如果用户是 yuejl, 12345 的话, shiro 不符合,shiro1 符合,不符合全部成功
UsernamePasswordToken token=new UsernamePasswordToken("yuejl","12345");
运行程序:
3. 如果用户是 yuezl, 1234 的话, shiro 符合,shiro1 符合,符合全部成功
UsernamePasswordToken token=new UsernamePasswordToken("yuezl","1234");
运行程序:
策略演示成功 。
本章节代码链接为:
链接:https://pan.baidu.com/s/1u8i2KHx0FuWbAbf4Fuejzg 提取码:okrl
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!