shiro 方法级别细粒度权限控制_第四章:Shiro的身份认证(Authentication)——深入浅出学Shiro细粒度权限开发框架——私塾在线原创...
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细粒度权限开发框架——私塾在线原创...相关推荐
- shiro 方法级别细粒度权限控制_Shiro的认证和权限控制
从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...
- 《前端》权限链接--vue前端权限控制方案详解附demo_feiyu_may的博客-CSDN博客_vue 前端权限
前端权限控制 - 潘正 - 博客园 https://www.cnblogs.com/guchengnan/p/11800947.html vue前端权限控制方案详解附demo_feiyu_may的博 ...
- 计算机动画制作第一节教案,付雪_ 第四章动画制作_第一节制作逐帧动画——教案设计(7页)-原创力文档...
信息技术课堂教学设计 教学内容 第四章 第一节 制作"逐帧"动画 学 校 北京市高井中学 授课教师 付 雪 课 型 新授课 课 时 1 日 期 教学 目标 = 1 \* GB1 ⒈ ...
- ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区...
原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...
- java程序设计基础_陈国君版第五版_第四章例题
java程序设计基础_陈国君版第五版_第四章例题 <pre name="code" class="java">public class Main4_ ...
- hive表级权限控制_数据库权限管理:表、行、列级别的权限控制
权限规则 1. 在配有主从集群时建议在主节点上做权限相关操作 2. 只有管理员和超级管理员才有将数据导入至表中的权限 3. 管理员用户赋予的是以整表为单位的权限,所有能赋予的权限为create/sel ...
- ssas表格模型 权限控制_创建第一个SSAS表格模型数据库
ssas表格模型 权限控制 Considering BI environment, when comparing Multidimensional Vs Tabular model databases ...
- ssas表格模型 权限控制_如何在SQL Server 2016中自动执行SSAS表格模型处理
ssas表格模型 权限控制 There are many ways to process your SSAS Tabular Model. This can be achieved in SSIS u ...
- java 接口权限控制_手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!...
SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/- 摘要 权限控管理作为后台管理系统中必要的功能,mall项目中结合Spring Secu ...
最新文章
- Linux 中FTP服务的应用(安装配置)
- ios purelayout--基础使用--进阶使用--看这就够了
- 阿里广告技术最新突破:全链路联动-面向最终目标的全链路一致性建模
- linux固定分辨率,如何锁定分辨率
- java 什么时候进行垃圾回收_java什么时候进行垃圾回收,垃圾回收的执行流程
- sscanf与正则表达式
- 计算机控制技术实际PID控制,计算机控制技术数字PID.doc
- JVM优化系列-对象内存分配和回收的细节
- JS(JQuery)操作Array的相关方法
- Git使用- 基本命令
- 查看Linux占用内存/CPU最多的进程
- XShell 与 xftp 官网免费下载(亲测有效)
- win10系统驱动备份及还原-命令行操作
- 计算机显示屏显示超出屏幕大小,电脑连接的显示器出错显示超出工作频率范围怎么恢复...
- vc调试总是提示项目已过期
- 理解什么叫管理vlan与业务VLAN,理解DTP及trunk的配置
- 人机交互技术的发展趋势是怎样的?
- Nature:给研究生的四条金玉良言;颜宁:写的真好,相见恨晚
- Cadence OrCAD Capture 修改添加阵列PIN的递增方向的方法
- KeyError: [] not found in axis_最IN拉花潮改“出圈”,欧拉白猫拓创无限可能_搜狐汽车...
热门文章
- ADS127L11采集板系统噪声评估
- Facebook 、Twitter、Snapchat等巨头齐聚GMIC在线,畅谈营销增长
- 在某高层建筑物中只有一部电梯,由N个正整数组成一个请求序列,列表中的数字表示电梯将在哪层停,电梯按列表顺序依次停靠电梯每上行一层需要花6秒时间,每下行一层需要花4秒时间,电梯每停一次需要用时5秒。
- oracle 磁盘 forc,通过卷管理器使用虚拟磁盘
- double保留小数位
- xp升级win7_重装经典的Win7系统指南
- STM32F407-高级定时器PWM输入功能
- 莱姆西林行业调研报告 - 市场现状分析与发展前景预测
- warkey作者停止开发新版,魔兽小助手该何去何从
- Java 课程设计_学生选课管理系统(控制台)