nStep3:SubjectManager 接收token 以及简单地委托给内部的Authenticator 实例通过调用authenticator.authenticate(token)。这通常是一个ModularRealmAuthenticator 实例,支持在身份验证中协调一个或多个Realm 实例。

n

nStep 4:如果应用程序中配置了一个以上的Realm,ModularRealmAuthenticator 实例将利用配置好的AuthenticationStrategy 来启动Multi-Realm 认证尝试。在Realms 被身份验证调用之前,期间和以后,AuthenticationStrategy 被调用使其能够对每个Realm 的结果作出反应。

n

nStep 5:每个配置的Realm 用来帮助看它是否支持提交的AuthenticationToken。如果支持,那么支持Realm 的getAuthenticationInfo 方法将会伴随着提交的token 被调用。getAuthenticationInfo 方法有效地代表一个特定Realm 的单一的身份验证尝试。

初识自定义

Realm

n这里先来个例子,认识一下:

public class MyRealm extends AuthorizingRealm{

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

String userName = (String) getAvailablePrincipal(principals);

//通过用户名去获得用户的所有资源,并把资源存入info中

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

Set s = new HashSet();

s.add("p1");  s.add("p2"); info.setStringPermissions(s);

Set r = new HashSet();

r.add("r1"); r.add("r2"); info.setRoles(r);

return info;}

protected AuthenticationInfo doGetAuthenticationInfo(

AuthenticationToken token) throws AuthenticationException {

//token中储存着输入的用户名和密码

UsernamePasswordToken upToken = (UsernamePasswordToken)token;

String username = upToken.getUsername();

String password = String.valueOf(upToken.getPassword());

//通常是与数据库中用户名和密码进行比对,这里就省略了

//比对成功则返回info,比对失败则抛出对应信息的异常AuthenticationException

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password .toCharArray(),getName());

return info;  }}

配置多个Realm

n上面的例子可以作为第一个Realm

n再复制一份,定义为MyRealm2,在返回user前添加抛出一个例外,表示认真没有通过,如下:

if(username.equals("javass")){

throw new AuthenticationException("MyRealm2 认证失败");

}

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password .toCharArray(),getName());

n在配置文件里面添加Realm的定义

myRealm1=cn.javass.hello.MyRealm

myRealm2=cn.javass.hello.MyRealm2

由于有多个realm,一般就需要配置AuthenticationStrategy了,而AuthenticationStrategy是跟Authenticator(认证器)相关的。

n配置Authenticator和AuthenticationStrategy

authenticator = org.apache.shiro.authc.pam.ModularRealmAuthenticator

authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy

authenticator.authenticationStrategy = $authcStrategy

authenticator.realms=$myRealm2,$myRealm1

n当然,你可以扩展并实现自己的Authenticator,一般没有必要

n最后把Authenticator设置给securityManager

securityManager.authenticator = $authenticator

n关于AuthenticationStrategy的配置,有三种:

AtLeastOneSuccessfulStrategy :如果一个(或更多)Realm 验证成功,则整体的尝试被认为是成功的。如果没有一个验证成功,则整体尝试失败。

FirstSuccessfulStrategy 只有第一个成功地验证的Realm 返回的信息将被使用。所有进一步的Realm 将被忽略。如果没有一个验证成功,则整体尝试失败

AllSucessfulStrategy 为了整体的尝试成功,所有配置的Realm 必须验证成功。如果没有一个验证成功,则整体尝试失败。

ModularRealmAuthenticator 默认的是AtLeastOneSuccessfulStrategy

n自定义自己的AuthenticationStrategy,通常是扩展自AbstractAuthenticationStrategy,示例如下:

public class MyAuthenticationStrategy extends AbstractAuthenticationStrategy{

public AuthenticationInfo afterAttempt(Realm realm, AuthenticationToken token, AuthenticationInfo singleRealmInfo, AuthenticationInfo aggregateInfo, Throwable t) throws AuthenticationException {

if(realm.getName().equals("myRealm2")){

if(singleRealmInfo==null || singleRealmInfo.getPrincipals()==null){

throw new AuthenticationException("主战认证未通过");

}

}

return super.afterAttempt(realm, token, singleRealmInfo, aggregateInfo, t);

}

}

至于具体覆盖扩展什么方法,需要根据你具体的策略来定。

多个Realm的验证顺序

n概述

非常重要的一点是:ModularRealmAuthenticator 将与Realm 实例以迭代的顺序进行交互。

在SecurityManager 中已经配置好了ModularRealmAuthenticator 对Realm实例的访问。当执行一个认证尝试时,它将会遍历该集合,并对每一个支持提交AuthenticationToken 的Realm 调用Realm 的getAuthenticationInfo 方法

n隐式排列

当你配置多个realm的时候,处理的顺序默认就是你配置的顺序。

这种情况通常就是只定义了realm,而没有配置securityManager的realms

n显示排列

也就是显示的配置securityManager.realms,那么执行的顺序就是你配置该值的realm的顺序。

通常更推荐显示排列。

shiro 方法级别细粒度权限控制_第四章:Shiro的身份认证(Authentication)——深入浅出学Shiro细粒度权限开发框架——私塾在线原创...相关推荐

  1. shiro 方法级别细粒度权限控制_Shiro的认证和权限控制

    从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...

  2. 《前端》权限链接--vue前端权限控制方案详解附demo_feiyu_may的博客-CSDN博客_vue 前端权限

    前端权限控制 - 潘正 - 博客园  https://www.cnblogs.com/guchengnan/p/11800947.html vue前端权限控制方案详解附demo_feiyu_may的博 ...

  3. 计算机动画制作第一节教案,付雪_ 第四章动画制作_第一节制作逐帧动画——教案设计(7页)-原创力文档...

    信息技术课堂教学设计 教学内容 第四章 第一节 制作"逐帧"动画 学 校 北京市高井中学 授课教师 付 雪 课 型 新授课 课 时 1 日 期 教学 目标 = 1 \* GB1 ⒈ ...

  4. ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区...

    原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...

  5. java程序设计基础_陈国君版第五版_第四章例题

    java程序设计基础_陈国君版第五版_第四章例题 <pre name="code" class="java">public class Main4_ ...

  6. hive表级权限控制_数据库权限管理:表、行、列级别的权限控制

    权限规则 1. 在配有主从集群时建议在主节点上做权限相关操作 2. 只有管理员和超级管理员才有将数据导入至表中的权限 3. 管理员用户赋予的是以整表为单位的权限,所有能赋予的权限为create/sel ...

  7. ssas表格模型 权限控制_创建第一个SSAS表格模型数据库

    ssas表格模型 权限控制 Considering BI environment, when comparing Multidimensional Vs Tabular model databases ...

  8. ssas表格模型 权限控制_如何在SQL Server 2016中自动执行SSAS表格模型处理

    ssas表格模型 权限控制 There are many ways to process your SSAS Tabular Model. This can be achieved in SSIS u ...

  9. java 接口权限控制_手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!...

    SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/- 摘要 权限控管理作为后台管理系统中必要的功能,mall项目中结合Spring Secu ...

最新文章

  1. Linux 中FTP服务的应用(安装配置)
  2. ios purelayout--基础使用--进阶使用--看这就够了
  3. 阿里广告技术最新突破:全链路联动-面向最终目标的全链路一致性建模
  4. linux固定分辨率,如何锁定分辨率
  5. java 什么时候进行垃圾回收_java什么时候进行垃圾回收,垃圾回收的执行流程
  6. sscanf与正则表达式
  7. 计算机控制技术实际PID控制,计算机控制技术数字PID.doc
  8. JVM优化系列-对象内存分配和回收的细节
  9. JS(JQuery)操作Array的相关方法
  10. Git使用- 基本命令
  11. 查看Linux占用内存/CPU最多的进程
  12. XShell 与 xftp 官网免费下载(亲测有效)
  13. win10系统驱动备份及还原-命令行操作
  14. 计算机显示屏显示超出屏幕大小,电脑连接的显示器出错显示超出工作频率范围怎么恢复...
  15. vc调试总是提示项目已过期
  16. 理解什么叫管理vlan与业务VLAN,理解DTP及trunk的配置
  17. 人机交互技术的发展趋势是怎样的?
  18. Nature:给研究生的四条金玉良言;颜宁:写的真好,相见恨晚
  19. Cadence OrCAD Capture 修改添加阵列PIN的递增方向的方法
  20. KeyError: [] not found in axis_最IN拉花潮改“出圈”,欧拉白猫拓创无限可能_搜狐汽车...

热门文章

  1. ADS127L11采集板系统噪声评估
  2. Facebook 、Twitter、Snapchat等巨头齐聚GMIC在线,畅谈营销增长
  3. 在某高层建筑物中只有一部电梯,由N个正整数组成一个请求序列,列表中的数字表示电梯将在哪层停,电梯按列表顺序依次停靠电梯每上行一层需要花6秒时间,每下行一层需要花4秒时间,电梯每停一次需要用时5秒。
  4. oracle 磁盘 forc,通过卷管理器使用虚拟磁盘
  5. double保留小数位
  6. xp升级win7_重装经典的Win7系统指南
  7. STM32F407-高级定时器PWM输入功能
  8. 莱姆西林行业调研报告 - 市场现状分析与发展前景预测
  9. warkey作者停止开发新版,魔兽小助手该何去何从
  10. Java 课程设计_学生选课管理系统(控制台)