`
lengyun3566
  • 浏览: 449843 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:381558
社区版块
存档分类
最新评论

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

阅读更多

 

使用控制器逻辑进行有条件渲染内容

 

         现在,让我们将刚刚用<authorize>标签实现的例子改成用java代码的方式。为了简洁起见,我们只实现一个例子,但实现基于控制器检查的其它例子是很简单直接的。

添加有条件显示的Log In链接

         为了替代Spring Security<authorize>标签,我们假设在模型数据中有一个Boolean变量来标示是否显示显示“Log in”链接,而这个变量可以在视图上得到。在传统的MVC模式下,视图不了解模型为何拥有这个值,它只需要使用即可。我们使用Java Standard Tag Library (JSTL)if标签,连同JSP EL表达式来实现有条件显示页面的部分。

 

<c:if test="${showLoginLink}">
  <c:url value="/login.do" var="loginUrl"/>
  <li><a href="${loginUrl}">Log In</a></li>
</c:if>

 现在看一下如下的代码以了解我们如何在控制器中将数据填充到模型中。

基于用户的凭证提供模型数据

         我们控制器的对象模型是符合面向对象模式的,所有的Spring MVC控制器扩展自一个简单的基类com.packtpub.springsecurity.web.controller.BaseController。这使得我们能够将通用的代码放在BaseController中,从而应用中所有的控制器都能够访问。首先,我们加入一个方法以从当前的request中得到Authentication的实现类:

 

protected Authentication getAuthentication() {
  return SecurityContextHolder.getContext().getAuthentication(); 
}

 接下类,我们添加一个方法 填充showLoginLink模型数据,此处使用Spring MVC的注解方式。

 

@ModelAttribute("showLoginLink")
public boolean getShowLoginLink() {
  for (GrantedAuthority authority : getAuthentication().
getAuthorities()) {
    if(authority.getAuthority().equals("ROLE_USER")) {
      return false;
    }  
  }
  return true;
}

 这个方法添加了@ModelAttribute注解,任何实现BaseController的控制器触发时,Spring MVC将会自动执行此方法。针对authorize标签方式的其它显示/隐藏功能,我们能够很简单地使用模型数据指令重复这种设计模式。

配置页面内授权的最好方式是什么?

         与以前版本的标签库相比,Spring Security 3 <authorize>标签的主要优势在于移除了很多使用中的困扰之处。在很多场景下,使用标签的url属性隔离了授权规则变化对JSP代码的影响。可以在以下场景下使用url属性:

l标签限制显示的功能能够通过一个简单url明确的声明;

l标签的内容能够明确的与URL隔离。

但是在典型的应用中,使用标签url属性的可能性会很低。现实情况下应用会比这个复杂的多,需要更多的相关逻辑才能确定如何渲染页面的各部分。

尽管使用Spring Security标签库来声明渲染页面部分的方法很诱人,这种方式基于sping的语法以及一些其它的方式(包括if...Grantedaccess方法),但是有很多情况下使用它并不是一个好主意:

l  Tag标签并不支持比角色成员更复杂的条件。例如,如果我们的应用的UserDetails实现包含了自定义的属性,如IP过滤、地理位置等,这些情况使用标准的<authorize>都不能支持。

但是,这些可以通过自定义的JSP标签或使用SpEL表达式来支持。即使如此,JSP也会直接绑定业务逻辑,而这并不是推荐做法。

l <authorize>标签必须在每一个使用的页面中引用。这可能会导致本来通用的规则产生潜在的不一致性,而这会在不同的物理界面文件中存在。好的面向对象系统设计建议条件规则只在一个地方存在,并在使用的地方对其进行引用。

可以通过封装并且重用JSP页面的部分来减少这类问题的发生(我们通过使用通用的JSP头文件已经对此进行了阐述),但是在一个复杂的应用中这个问题在所难免。

l 不能在编译阶段校验规则的正确性。编译期常量能够在典型的基于java对象系统中使用,JSP tag标签需要(典型情况下)硬编码角色名字,而简单的拼写错误很难被察觉。

公平来讲,这样的拼写错误能够很容易地在运行应用的功能测试中发现,但是使用标准的Java组件单元测试这样的问题更容易被发现。

         我们可以看到,尽管基于JSP方式的内容有条件渲染很便利,但是也有一些明显的不足。

        

         所有的这些问题都能够通过在控制器中使用代码推送数据到视图层来解决。另外,在代码中进行高级的授权决定能够享受到重用、编译器检查以及适当分离模型、视图、控制器所带来的好处。

4
7
分享到:
评论

相关推荐

    springboot springsecurity动态权限控制

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

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

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

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

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

    spring security实现动态授权

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

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

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

    spring security权限控制

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

    Spring Security 权限控制中文API

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

    Spring security认证授权

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它提供了全面的安全解决方案,包括用户认证、权限授权、会话管理、CSRF防护以及基于HTTP的访问控制。在这个例子中,我们将...

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

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

    spring boot +spring security+thymeleaf实现权限

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

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

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

    Spring Security 资料合集

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

    spring3中增加 spring security控制权限

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

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

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

    Spring Security in Action

    Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 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 实现用户角色权限登录认证

    总结来说,本项目展示了如何利用SpringBoot、SpringSecurity和JPA在IntelliJ IDEA环境下构建一个完整的用户角色权限管理系统,通过security.sql和security-jpa这两个关键组件,实现了数据初始化和核心业务逻辑的构建...

    SpringSecurity实现的权限管理(含包)

    SpringSecurity是Java开发中用于安全控制的一个强大框架,主要用于实现身份验证、授权和访问控制等功能。在本资源中,我们关注的是如何通过SpringSecurity来实现一个简单的权限管理系统。以下将详细解释Spring...

Global site tag (gtag.js) - Google Analytics