- 浏览: 299077 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
请求是怎样被授权的?
在 Spring Security 的默认过滤器链中,最后一个 servelt 过滤器是 FilterSecurityInterceptor ,它的作用是判断一个特定的请求是被允许还是被拒绝。在 FilterSecurityInterceptor 被触发的时候,安全实体已经经过了认证,所以系统知道他们是合法的用户。(其实也有可能是匿名的用户,译者注)。请记住的一点是, Authentication 提供了一个方法( (List<GrantedAuthority>
getAuthorities() ),将会返回当前安全实体的一系列权限列表。授权的过程将使用这个方法提供的信息来决定一个特定的请求是否会被允许。
需要记住的是授权是一个二进制的决策——一个用户要么有要么没有访问一个受保护资源的权限。在授权中,没有模棱两可的情景。
在 Spring Security 中,良好的面向对象设计随处可见,在授权决策管理中也不例外。回忆一下我们在本章前面的讨论,一个名为访问控制决策器( access decision manager )的组件负责作出授权决策。
在 Spring Security 中, o.s.s.access.AccessDecisionManager 接口定义了两个简单而合理的方法,它们能够用于请求的决策判断流程:
<!--[if !supportLists]-->l <!--[endif]-->supports :这个逻辑操作实际上包含两个方法,它们允许 AccessDecisionManager 的实现类判断是否支持当前的请求。
<!--[if !supportLists]-->l <!--[endif]-->decide :基于请求的上下文和安全配置,允许 AccessDecisionManager 去核实访问是否被允许以及请求是否能够被接受。 decide 方法实际上没有返回值,通过抛出异常来表明对请求访问的拒绝。
与 AuthenticationException 及其子类在认证过程中的使用很类似,特定类型的异常能够表明应用在授权决策中的不同处理结果。 o.s.s.access.AccessDeniedException 是在授权领域里最常见的异常,因此值得过滤器链进行特殊的处理。我们将在第六章中详细介绍它的高级配置。
AccessDecisionManager 是能够通过标准的 Spring bean 绑定和引用实现完全的自定义配置。 AccessDecisionManager 的默认实现提供了一个基于 AccessDecisionVoter 接口和投票集合的授权机制。
投票器( voter )是在授权过程中的一个重要角色,它的作用是评估以下的内容:
<!--[if !supportLists]-->l <!--[endif]-->要访问受保护资源的请求所对应上下文(如 URL 请求的 IP 地址);
<!--[if !supportLists]-->l <!--[endif]-->用户的凭证信息(如果存在的话);
<!--[if !supportLists]-->l <!--[endif]-->要试图访问的受保护资源;
<!--[if !supportLists]-->l <!--[endif]-->系统的配置以及要访问资源本身的配置参数。
AccessDecisionManager 还会负责传递要请求资源的访问声明信息(在代码中为 ConfigAttribute 接口的实现类)给投票器。在 web URL 的请求中,投票器将会得到资源的访问声明信息。如果看一下我们配置文件中非常基础的拦截声明,我们能够看到 ROLE_USER 被设置为访问配置并用于用户试图访问的资源:
<intercept-url pattern="/*" access="ROLE_USER"/> |
投票器将会对用户是否能够访问指定的资源做出一个判断。 Spring Security 允许过滤器在三种决策结果中做出一种选择,它们的逻辑定义在 o.s.s.access.AccessDecisionVoter 接口中通过常量进行了定义。
决策类型 |
描述 |
Grant (ACCESS_GRANTED) |
投票器允许对资源的访问 |
Deny (ACCESS_DENIED) |
投票器拒绝对资源的访问 |
Abstain (ACCESS_ABSTAIN) |
投票器对是否能够访问做了弃权处理(即没有做出决定)。可能在多种原因下发生,如: <!--[if !supportLists]-->l <!--[endif]-->投票器没有确凿的判断信息; <!--[if !supportLists]-->l <!--[endif]-->投票器不能对这种类型的请求做出决策。 |
正如你从访问决策相关类和接口的设计中可以猜到的那样, Spring Security 的这部分被精心设计,所以认证和访问控制的使用场景并不仅仅限于 web 领域。我们将会在:精确的访问控制 中关于方法级别的安全时,再次讲解投票器和访问控制管理。
当将他们组合在一起,“对 web 请求的默认认证检查”的整体流程将如下图所示:
我们可以看到
ConfigAttribute
能够从配置声明(在
DefaultFilterInvocationSecurityMetadataSource
类中保存)中传递数据到投票器,投票器并不需要其他的类来理解
ConfigAttribute
的内容。这种分离能够为新类型的安全声明(例如我们将要看到的方法安全声明)使用相同的访问决策模式提供基础。
配置 access decision 集合
实际上 Spring Security 允许通过 security 命名空间来配置 AccessDecisionManager 。 <http> 元素的 access-decision-manager-ref 属性来指明一个实现了 AccessDecisionManager 的 Spring Bean 。 Spring Security 提供了这个接口的三个实现类,都在 o.s.s.access.vote 包中:
类名 |
描述 |
AffirmativeBased |
如果有任何一个投票器允许访问,请求将被立刻允许,而不管之前可能有的拒绝决定。 |
ConsensusBased |
多数票(允许或拒绝)决定了 AccessDecisionManager 的结果。平局的投票和空票(全是弃权的)的结果是可配置的。 |
UnanimousBased |
所有的投票器必须全是允许的,否则访问将被拒绝。 |
配置使用 UnanimousBased 的访问决策管理器( access decision manager )
如果你想修改我们的应用来使用 UnanimousBased 访问决策管理器,我们需要修改两个地方。首先让我们在 <http> 元素上添加 access-decision-manager-ref 属性:
<http auto-config="true" access-decision-manager-ref="unanimousBased" > |
这是一个标准的 Spring Bean 的引用,所以这需要对应一个 bean 的 id 属性。接下来,我们要定义这个 bean (在 dogstore-base.xml 中),并与我们引用的有相同的 id :
<bean class="org.springframework.security.access.vote.UnanimousBased" id="unanimousBased"> <property name="decisionVoters"> <list> <ref bean="roleVoter"/> <ref bean="authenticatedVoter"/> </list> </property> </bean> <bean class="org.springframework.security.access.vote.RoleVoter" id="roleVoter"/> <bean class="org.springframework.security.access.vote. AuthenticatedVoter" id="authenticatedVoter"/> |
你可能象知道 decisionVoters 属性是什么。这个属性在我们不声明 AccessDecisionManager 时,是自动配置的。默认的 AccessDecisionManager 要求我们配置投票器的一个列表,它们将会在认证决策时用到。这里列出的两个投票器是 security 命名空间配置默认提供的。
遗憾的是, Spring Security 没有为我们提供太多的投票器,但是实现 AccessDecisionVoter 接口并在配置中添加我们的实现并不是一件困难的事情。我们将在第六章看一个例子。
我们引用的两个投票器介绍如下:
类名 |
描述 |
例子 |
o.s.s.access. vote.RoleVoter |
检查用户是否拥有声明角色的权限( GrantedAuthority )。 access 属性定义了 GrantedAuthority 的一个列表。预期会有 ROLE_ 前缀,但这也是可配置的。 |
access="ROLE_USER,ROLE_ADMIN" |
o.s.s.access. vote.AuthenticatedVoter |
支持特定类型的声明,允许使用通配符: <!--[if !supportLists]-->l <!--[endif]-->IS_AUTHENTICATED_FULLY ——允许提供完整的用户名和密码的用户访问; <!--[if !supportLists]-->l <!--[endif]-->IS_AUTHENTICATED_REMEMBERED ——如果用户是通过 remember me 功能认证的则允许访问; <!--[if !supportLists]-->l <!--[endif]-->IS_AUTHENTICATED_ANONYMOUSLY ——允许匿名用户访问。 |
access=" IS_AUTHENTICATED_ANONYMOUSLY" |
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 9672、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 864最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2619作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1010一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3381不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1693笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1248认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1017Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 966手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1161理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4195Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1431实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1055第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 993方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 847保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 996使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 897实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 921第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1214将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1737你是否愿意在密码上添加点salt ? 如果安 ...
相关推荐
第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...
NULL 博文链接:https://lengyun3566.iteye.com/blog/1104456
第3章 Spring中的Bean配置 3.1 在Spring IoC容器里配置Bean 3.1.1 问题描述 3.1.2 解决方案 3.1.3 实现方法 3.2 实例化Spring IoC容器 3.2.1 问题描述 3.2.2 解决方案...
第3章 Spring中的Bean配置 3.1 在Spring IoC容器里配置Bean 3.1.1 问题描述 3.1.2 解决方案 3.1.3 实现方法 3.2 实例化Spring IoC容器 3.2.1 问题描述 3.2.2 解决方案...
第3章 Spring中的Bean配置 3.1 在Spring IoC容器里配置Bean 3.1.1 问题描述 3.1.2 解决方案 3.1.3 实现方法 3.2 实例化Spring IoC容器 3.2.1 问题描述 3.2.2 解决方案 ...
第二章 Spring Security起步................................................................................................ 15 安全的核心概念 .............................................................
第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案...
第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案...
第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源...
第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源...
第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义属性编辑器 3.5使用spring的特殊...
Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring ...
第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...
第3 章 Spring 高级话题 .... ............................ 48 3.1 Spring Aware .... ..................................... 48 3.2 多线程 .... .... ......... 51 3.3 计划任务 .... .... ..... 54 3.4 条件...
第3 章 Spring 高级话题 .... ............................ 48 3.1 Spring Aware .... ..................................... 48 3.2 多线程 .... .... ......... 51 3.3 计划任务 .... .... ..... 54 3.4 条件...
第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...
第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...
66 第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 .... .......................... 72 第三部分 实战Spring Boot 第5 章 Spring Boot 基础 .... ......................... 122 第6 章 Spring Boot 核心 .....
第二章 通过体脂计算器(BMI)项目,掌握使用Maven生成Springboot工程,Angular与Springboot的协作机制、从而理解前后端分别架构的实现方法。 第三章 通过开发一个CMS系统,既网站内容管理系统,来掌握Springboot...
深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...