第五讲 shiro的验证策略(金庭波)

本文介绍了Apache Shiro框架中多Realm验证的配置方法及不同验证策略的效果对比。通过示例代码展示了如何设置验证策略来控制多个Realm的身份验证流程。

shiro的验证策略

        shiro提供了多个Realm的验证。那么,究竟是只要有一个Realm验证成功就算成功呢?还是所有的Realm验证成功才算成功呢? 还有就是,身份验证信息,究竟是只返回第一个Realm验证成功的身份信息呢?还是返回所有Realm验证成功的信息?

        再有一个问题是:对于多个Realm身份验证的ini配置文件,应该按什么样的原则进行书写呢?请看下面的实例:

第一步:新建一个mevan工程,是java工程还是web工程远所谓;

第二步:改工程的编码为UTF-8; 

第三步:pom.xml内容为:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>

</dependencies>
----------------------------------------------------------------------------------------------------

第三步:在src/main/resources下新建一个shiro.ini文件,内容如下:
[main]
#验证对象由多个验证的ModularRealmAuthenticator去生成。
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator 
#验证策略:FirstSuccessfulStrategy表示只要有一个成功就是验证成功
authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy 
#验证对象的策略
authenticator.authenticationStrategy=$authenticationStrategy 
#shiro验证api的入口
securityManager.authenticator=$authenticator

myRealm1=com.jintingbo.www.MyRealm1 
myRealm2=com.jintingbo.www.MyRealm2

securityManager.realms=$myRealm1,$myRealm2
----------------------------------------------------------------------------------------------------

第四步:在src/main/java下新建一个com.jintingbo.www包,在此包下新建两个Realm类和一个测试类

public class MyRealm1 implements Realm {
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
String username = (String)token.getPrincipal();  //得到用户名
String password = new String((char[])token.getCredentials()); //得到密码
if(!"zhang".equals(username)) { 
throw new UnknownAccountException(); //如果用户名错误

if(!"123".equals(password)) { 
throw new IncorrectCredentialsException(); //如果密码错误

//如果身份认证验证成功,返回一个 AuthenticationInfo 实现;
return new SimpleAuthenticationInfo(username, password, getName()); 
}
public String getName() {
return "aaa"; //这是aaa就当是本Realm的名字了
}
public boolean supports(AuthenticationToken arg0) {
return arg0 instanceof UsernamePasswordToken;
}

}

//---------------------------------------------------------------------

public class MyRealm2 implements Realm {
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
String username = (String)token.getPrincipal();  //得到用户名
String password = new String((char[])token.getCredentials()); //得到密码
if(!"li".equals(username)) { 
throw new UnknownAccountException(); //如果用户名错误

if(!"123".equals(password)) { 
throw new IncorrectCredentialsException(); //如果密码错误

//如果身份认证验证成功,返回一个 AuthenticationInfo 实现;
return new SimpleAuthenticationInfo(username, password, getName()); 
}
public String getName() {
return "bbb";
}
public boolean supports(AuthenticationToken arg0) {
return arg0 instanceof UsernamePasswordToken;
}

}

//---------------------------------------------------------------------

public class MyTest {
private static void login(String configFile) { 
//1、获取 SecurityManager 工厂,此处使用 Ini 配置文件初始化 SecurityManager 
Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(configFile); 
//2、得到 SecurityManager 实例  并绑定给 SecurityUtils 
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); 
SecurityUtils.setSecurityManager(securityManager); 
//3、得到 Subject 及创建用户名/密码身份验证 Token(即用户身份/凭证)
Subject subject = SecurityUtils.getSubject(); 
UsernamePasswordToken token = new UsernamePasswordToken("zhang","123"); 
subject.login(token); 


public static void main(String[] args) {
login("classpath:shiro.ini"); 
Subject subject = SecurityUtils.getSubject(); 
//得到一个身份集合,其包含了 Realm 验证成功的身份信息
PrincipalCollection principalCollection = subject.getPrincipals(); 
int n=principalCollection.asList().size();
System.out.println("有"+n+"个Realm验证成功了!");
if(principalCollection.asList().size()==1){
System.out.println("成功!");
}else{
System.out.println("失败!");
}
}

}

----------------------------------------------------------------------------------------------------

第五步:运行

第六步:知识扩展

在ini文件中,修改authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy 为

authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy就是只要有一个成功就是成功,但返回的是所有Realm身份验证成功的信息;

如果修改为:authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy,就是必须所有的Realm验证成功后才算成功

完毕!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庭博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值