`
kong0itey
  • 浏览: 305997 次
社区版块
存档分类
最新评论

《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)

阅读更多

实现授权精确控制的方法

 

精确的授权指的是基于用户特定的请求进行授权的应用功能特性。不同于我们在第二章: Spring Security 起步、第三章增强用户体验和第四章凭证安全存储 中的粗粒度的授权,精确的授权一般指的是对页面中的部分进行选择性显示的功能,而不是限制访问一个完整的页面。现实世界中的应用将会花费可观的时间用在规划精确授权的细节上。

         Spring Security 为我们提供了两种方式来实现选择性显示的功能:

l  Spring Security JSP 标签库允许通过标准的 JSP 标签库语法在页面本身添加条件访问声明;

l  MVC 应用的控制层 ,检查用户的授权从而使得控制层做出能否访问的判断并将决定的结果绑定到模型 数据提供给视图层 这种方式依赖于标准的 JSTL 条件实现界面渲染和数据绑定,这种方式比 Spring Security JSP 标签库复杂一些,但是,它与标准的 web 应用 MVC 逻辑设计更吻合。

在开发精确控制授权的 web 应用时,这两种方法都能很好的实现功能。让我们通过 JBCP Pets 用例来介绍没种方法的实现。

 

我们希望使用安全规划的结果来保证在网站范围内的菜单栏上“退出”和“我的订单” 链接只能对登录过的或已购买的用户(分别为 ROLE_USER ROLE_CUSTOMER )显示。我们还会保证“登录”链接只对浏览站点的未认证访客(不具备 ROLE_USER 的用户)可见。我们将会介绍这两种添加该功能的方式,首先从 Spring Security JSP 标签库开始。

 

使用 Spring Security 的标签库有选择地渲染内容

我们在第三章中见到过,可以使用 Spring Security 的标签库访问存在于 Authentication 对象中的数据,这里我们将会见识到标签库的一些其它强大功能。 Spring Security 标签库最常用的功能就是基于授权规则有条件地渲染页面的各部分。这是通过 <authorize> 标签来实现的,它与 JSTL 核心库的 <if> 标签类似,在标签体中的内容是否显示由标签属性的条件结果来确定。让我们使用 <authorize> 标签按条件显示页面的部分。

基于 URL 访问规则进行有条件渲染

Spring Security 的标签库提供了按照已有的 URL 授权规则进行内容渲染的功能,而 URL 授权规则已经在应用安全的配置文件中进行了定义。这是通过使用 <authorize> 标签的 <url> 属性来达到的。

例如,我们要保证“ My Account ”链接只能对实际登录站点的用户显示——回忆一下我们在前面定义的如下访问规则:

 

Xml代码  收藏代码
  1. < intercept-url   pattern = "/account/*.do"    
  2. < span   style = "white-space: pre;" >      </ span > access = "hasRole('ROLE_USER') and fullyAuthenticated" />   

 所以, JSP 中条件显示“ My Account ”链接的代码如下所示:

 

Html代码  收藏代码
  1. < sec:authorize   url = "/account/home.do" >   
  2.   < c:url   value = "/account/home.do"   var = "accountUrl" />   
  3.   < li > < a   href = "${accountUrl}" > My Account </ a > </ li >   
  4. </ sec:authorize >   

 这能够保证除非用户拥有足够的权限来访问指定的 URL ,否则 tag 中的内容不会显示。还可以通过 HTTP 方法实现更高质量的检查,这要通过 method 属性来设置。

 

Xml代码  收藏代码
  1. < sec:authorize   url = "/account/home.do"    method = "GET" >   
  2.   < c:url   value = "/account/home.do"   var = "accountUrl" />   
  3.   < li > < a   href = "${accountUrl}" > My Account </ a >  (with 'url' attr) </ li >   
  4. </ sec:authorize >   

 使用 url 属性对代码块定义授权检查的方法是很方便的,因为它对 JSP 中的实际授权检查进行了抽象并将其保存在安全配置文件中。

【注意的是, HTTP 方法应该与 <intercept-url> 安全声明中的一致,否则它们将不会按照你预期的进行匹配。另外,注意 URL 应该是对于 web 应用上下文根的相对路径(如同 URL 访问规则一样)。】

对于很多场景来说,使用 <authorize> 标签能够保证只有用户允许看见的前提下,正确地渲染链接或 action 相关的内容。需要记住的是,这个标签不仅能够包在一个链接外面,如果用户没有权限提交这个 form 的时候,它还能包在整个 form 外边。

 

基于 Spring 表达式语言进行有条件渲染

 

另外,可以联合使用 <authorize> 标签和 Spring 表达式语言( SpEL )更灵活地显示 JSP 内容。

回忆一下在第二章中我们初次体验 SpEL 提供的强大表达式语言, Spring Security 对其进行了更强的扩展,从而能够对当前安全的请求构建表达式。如果我们对前面的例子使用 SpEL 进行重构的话,在 <authorize> 标签中限制访问“ My Account ”链接的代码应该如下:

 

Html代码  收藏代码
  1. < sec:authorize   access = "hasRole('ROLE_USER') and fullyAuthenticated" >   
  2.   < c:url   value = "/account/home.do"   var = "accountUrl" />   
  3.   < li > < a   href = "${accountUrl}" > My Account </ a >  (with 'access' attr) </ li >   
  4. </ sec:authorize >   

          SpEL 进行求值计算的代码与 <intercept-url> 所定义的访问规则(假设配置了表达式)背后所使用的代码是一样的。所以,同样的内置函数和属性在 <authorize> 标签中都是可以通过表达式使用的。

         以上的两种使用 <authorize> 的方式都可以实现基于安全授权规则对页面显示内容进行精确控制渲染的强大功能。

使用 Spring Security2 的方式进行有条件渲染

         以上提到的两种使用 Spring Security 标签库的方法实际上是 Spring Security3 新增的功能,并且这也是按照授权规则实现页面级安全的推荐方法;但是,同样是 <authorize> 标签支持其他的操作方法,这可能会在遗留代码中遇到,也可能在一定场景下,这样的方式能够更好的满足你的需求。

基于缺失某角色有条件显示内容

Log In ”链接应该只能对匿名的用户显示,也就是没有 ROLE_USER 角色的用户。 <authorize> 标签通过 ifNotGranted 属性支持这种类型的规则:

 

Html代码  收藏代码
  1. < sec:authorize   ifNotGranted = "ROLE_USER" >   
  2.  < c:url   value = "/login.do"   var = "loginUrl" />   
  3.  < li > < a   href = "${loginUrl}" > Log In </ a > </ li >   
  4. </ sec:authorize >   

 如果你现在以匿名用户试图访问站点,将会看到一个指向登录 form 的链接。

基于拥有列表中的某一个角色有条件显示内容

         如同上一步那样,“ Log Out ”链接应该对拥有账号且已经登录的用户进行显示。 ifAnyGranted 属性在渲染内容前,要求用户拥有几个特定角色中的任何一个。我们用“ Log Out ”链接的方式来展示其使用:

 

Html代码  收藏代码
  1. < sec:authorize   ifAnyGranted = "ROLE_USER" >   
  2.   < c:url   value = "/logout"   var = "logoutUrl" />   
  3.   < li > < a   href = "${logoutUrl}" > Log Out </ a > </ li >   
  4. </ sec:authorize >   

 注意的是 ifAnyGranted 属性允许是以逗号分隔的角色集合来确定适当的匹配结果,用户只需要拥有角色中的任意一个标签中的内容就会渲染。

基于拥有列表中的所有个角色有条件显示内容

         最后,使用 ifAllGranted 属性要求用户拥有标签中定义的所有角色:

 

Xml代码  收藏代码
  1. < sec:authorize   ifAllGranted = "ROLE_USER,ROLE_CUSTOMER" >   
  2.   < c:url   value = "/account/orders.do"   var = "ordersUrl" />   
  3.   < li > < a   href = "${ordersUrl}" > My Orders </ a > </ li >   
  4. </ sec:authorize >   

 我们能够看到 authorize 标签的多种语法,以在不同的环境下使用。注意的是我们在前面讲到的三个属性可以组合使用。如 ifNotGranted ifAnyGranted 属性能够联合使用以提供稍微复杂的 Boolean 等式。

使用 JSP 表达式

以上的三种页面授权方法( (ifNotGranted ifAnyGranted ifAllGranted )支持 JSP EL 表达式,它将会执行并返回授权的 GrantedAuthority (角色等)。如果授权要求的列表会根据页面计算结果而变化的话,这将会提供一定的灵活性。

 

分享到:
评论

相关推荐

    springboot springsecurity动态权限控制

    在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...

    spring security实现动态授权

    5. **权限表达式**:使用Spring Security的`ExpressionBasedAccessDecisionManager`结合`SpEL (Spring Expression Language)`,可以在URL、方法等安全元数据上定义权限表达式。 6. **配置SecurityConfig**:在...

    Spring Security如何使用URL地址进行权限控制

    Spring Security如何使用URL地址进行权限控制 Spring Security是一个功能强大且广泛应用的Java安全框架,它提供了许多功能,包括身份验证、授权、加密等。其中,权限控制是Spring Security的一个重要组件,它允许...

    Spring Security3中文文档

    这里讲解了如何实现精细的权限控制,包括页面级权限的实现、业务层的安全保护以及方法级别的安全控制。这部分内容对于构建高度安全的应用程序至关重要。 ### 第六章:自定义安全组件 本章重点在于如何自定义Spring...

    spring security 2.0 的简单配置使用(补)——用aop控制method级权限

    在本文中,我们将深入探讨如何在Spring Security 2.0版本中配置并使用AOP(面向切面编程)来实现方法级别的权限控制。首先,我们需要理解Spring Security的基础概念。 1. **Spring Security基本架构** Spring ...

    spring Security3中文教程,经典的

    - **保护业务层**:不仅页面访问需要权限控制,业务逻辑中的方法调用也应受到保护,避免未授权访问。 #### 六、高级配置和扩展 - **实现一个自定义的安全过滤器**:开发者可以自定义过滤器,例如基于IP地址的访问...

    Spring Security+OAuth2 精讲,打造企业级认证与授权

    本课程"Spring Security+OAuth2 精讲,打造企业级认证与授权"深入浅出地讲解了这两个框架的使用和集成,旨在帮助开发者构建安全、高效的应用系统。 Spring Security是Spring生态系统中的一个强大安全框架,它提供了...

    Spring security认证授权

    综上所述,这个Spring Security的例子展示了如何结合数据库动态配置用户信息,实现认证和授权功能。通过理解并实践这些概念,开发者可以构建出安全、灵活的应用程序。记得在实际应用中,一定要考虑安全性最佳实践,...

    SpringSecurity+OAuth2+JWT分布式权限控制.zip

    综上所述,这个项目展示了如何将Spring Security、OAuth2和JWT结合起来,实现一个完整的分布式权限控制系统。开发者可以从中学习到如何配置Spring Security来处理认证和授权,如何使用OAuth2来管理用户授权,以及...

    spring security权限控制

    在本文中,我们将深入探讨Spring Security如何实现权限控制,并通过一个名为"springsecuritydemo4"的示例项目来理解其核心概念。 首先,Spring Security 的权限控制主要涉及以下几个关键组件: 1. **认证...

    spring boot +spring security+thymeleaf实现权限

    在本文中,我们将深入探讨如何使用Spring Boot、Spring Security和Thymeleaf这三个强大的Java技术栈组件来实现一个全面的权限管理系统,同时涵盖Remember-Me功能。Spring Boot简化了Spring应用的开发,Spring ...

    Spring Security 权限控制中文API

    5. **权限服务(Permission Service)**:对于复杂的权限控制,Spring Security 提供了PermissionEvaluator接口,允许自定义权限评估逻辑。例如,你可能需要检查用户是否具有删除某个文件的权限。 6. **会话管理...

    Spring Security 资料合集

    这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security使用手册.pdf" 将深入探讨这些概念,并提供实践指导,帮助读者掌握如何在实际项目中应用Spring Security。通过学习这些...

    SpringBoot集成Spring Security实现权限控制【完整源码+数据库】

    SpringBoot集成Spring Security是现代Java应用中常见的安全框架组合,它们为开发者提供了强大的权限管理和访问控制功能。Spring Security是一个全面的、高度可配置的安全框架,它涵盖了认证、授权以及会话管理等多个...

    《Spring Security3》第二章第三部分翻译(下)附前两章doc文档

    《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...

    Spring Security in Action

    Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...

    spring3中增加 spring security控制权限

    本篇文章将深入探讨如何在Spring 3中整合Spring Security来实现权限控制,以保护你的应用程序免受非法访问。 首先,我们需要理解Spring Security的核心概念。它主要由四个部分组成:认证(Authentication)、授权...

    spring security3动态权限

    struts2 + spring3 + hibernate3 + spring security3 + mysql + tomcat sys_users;sys_roles;sys_authorities;sys_resources;sys_users_roles;sys_roles_authorities;sys_authorities_resources; PS:此项目运行不...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    2. **SpringSecurity**:SpringSecurity是一个用于保护Web应用的安全框架,提供了身份验证、授权等功能。它通过一系列拦截器对HTTP请求进行过滤,确保只有经过认证和授权的用户才能访问特定资源。在这个项目中,...

    spring security3 中文版本

    Spring Security 3.0.1 是在 Spring Security 3.0 的基础上进行的一次 bug 修复版本,主要针对先前版本中存在的问题进行了修正。此次版本未引入新的功能,但修正了一些已知的问题,增强了稳定性。 ##### 1.4 获取 ...

Global site tag (gtag.js) - Google Analytics