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

《Spring Security3》第四章第二部分翻译(JdbcDaoImpl的高级配置)(转载)

阅读更多

 

JdbcDaoImpl 的高级配置

JdbcDaoImpl 拥有众多的可配置选项使其可以在已存在的 schema 中使用,或对其功能进行更复杂地调整。在很多场景下,很可能我们只需调整内置 UserDetailsService 类的配置而不需要写自己的代码。

 

有一个很重要的功能就是在用户( User )和权限( GrantedAuthority )之间添加一个隔离层( a level of indirection ——找不到更好的译法了),这通过将 GrantedAuthority 按照逻辑划分成集合即组( group )来实现。用户能够被分配到一个或多个组,而组的成员被赋予了一系列的 GrantedAuthority 声明。



 正如在图中所描述的那样,中间的隔离层使得我们可以将相同集合的角色分派给很多人,而这只需要指定新用户到存在的组中即可。将这与我们之前的做法对比,在以前的做法是将 GrantedAuthority 直接分配给单个的用户。

 

这种将权限进行打包处理的方式可能在以下的场景中用到:

 

 

l  要将用户分成不同的组,而组之间有些角色是重叠的;

l  想要全局地修改一类用户的权限。如,如果你拥有一个“供应商”的分组,而你想要修改他们能否访问应用特定区域的设置;

l  拥有大量的用户,你不需要用户级别的授权配置。

 

除非你的应用用户量很有限,否则很可能要使用基于组的访问控制。这种管理方式的简便性和扩展性带来的价值远远超过了它稍微增加的复杂性。这种将用户权限集中到组中的技术通常叫做基于组的访问控制( Group-Based Access Control GBAC )。

【基于组的访问控制几乎在市面上任何安全的操作系统和软件包中都能看到。微软的 活动目录( Active Directory AD) 是大范围使用 GBAC 的典型实现,它把 AD 的用户纳入组中并给组授权权限。通过使用 GBAC ,能够指数级得简化对大量基于 AD 组织的权限管理。想一下你所使用软件的安全功能——用户、分组以及权限是如何管理的?这种方式编写安全功能的利弊是什么?】

 

让我们对 JBCP Pets 添加一层抽象,并将基于组的授权理念应用于这个站点。

配置基于组的授权

我们会为站点添加两个组——普通用户(我们将其称为“ Users ”)和管理员(我们将其称为“ Administrators ”)。通过修改用于启动数据库的 SQL 脚本,将已经存在的 guest admin 账号分配到合适的组中。

配置 JdbcDaoImpl 以使用用户组

首先,我们需要为 JdbcDaoImpl 的自定义实现类设置属性以启用组的功能,并关闭对用户直接授权的功能。在 dogstore-base.xml 中添加如下的 bean 声明:

 

Xml代码  收藏代码
  1. < bean   id = "jdbcUserService"    
  2.       class = "com.packtpub.springsecurity.security.CustomJdbcDaoImpl" >   
  3.   < property   name = "dataSource"   ref = "dataSource" />   
  4.   < property   name = "enableGroups"   value = "true" />   
  5.   < property   name = "enableAuthorities"   value = "false" />   
  6. </ bean >   

 注意的是,如果你一直跟着我们的例子在做,并且使用了 JdbcUserManager 的代码和配置,请对其进行修改,因为在本章的剩余部分我们将使用 CustomJdbcDaoImpl

修改初始载入的 SQL 脚本

我们需要简单修改构建数据库的 SQL 语句:

l  定义我们的组信息;

l  指定 GrantedAuthority 声明到组中;

l  指定用户到组中。

 

简单起见,我们声明一个名为 test-users-groups-data.sql 的新 SQL 脚本。

首先,添加组:

 

Sql代码  收藏代码
  1. insert   into  groups(group_name)  values  ( 'Users' );  
  2. insert   into  groups(group_name)  values  ( 'Administrators' );  
 

接下来,指定角色到组中:

 

Sql代码  收藏代码
  1. insert   into  group_authorities(group_id, authority)  select  id,'ROLE_  
  2. USER ' from groups where group_name=' Users';  
  3. insert   into  group_authorities(group_id, authority)  select  id,'ROLE_  
  4. USER ' from groups where group_name=' Administrators';  
  5. insert   into  group_authorities(group_id, authority)  select  id,'ROLE_  
  6. ADMIN' from groups where group_name=' Administrators';  

 接下来,创建用户:

 

Sql代码  收藏代码
  1. insert   into  users(username,  password , enabled)  values    
  2. ('admin' , 'admin' , true );  
  3. insert   into  users(username,  password , enabled)  values    
  4. ('guest' , 'guest' , true );  

 最后,指定用户到组中:

 

Sql代码  收藏代码
  1. insert   into  group_members(group_id, username)  select  id, 'guest'   from    
  2. groups where  group_name= 'Users' ;  
  3. insert   into  group_members(group_id, username)  select  id, 'admin'   from    
  4. groups where  group_name= 'Administrators' ;  
 

修改嵌入式的数据库创建声明

我们需要更新嵌入式 HSQL 数据库的创建配置指向这个脚本,而不是已经存在的 test-data.sql 脚本:

 

Xml代码  收藏代码
  1. < jdbc:embedded-database   id = "dataSource"   type = "HSQL" >   
  2.   < jdbc:script   location = "classpath:security-schema.sql" />   
  3.   < jdbc:script   location = "classpath:test-users-groups-data.sql" />   
  4. </ jdbc:embedded-database >   

 要注意的是, security-schema.sql 脚本已经包含了支持组功能的表声明,所以我们不需要修改这个脚本了。

 

到这里,你可以重启 JBCP Pets 站点,它将与以前的表现完全一致,但是,我们在用户和权限间添加的抽象层使得我们能够更容易地开发开发复杂的用户管理功能。

 

让我们暂时离开 JBCP Pets 的场景,了解在这个方面上一个更为重要的配置。

使用遗留的或用户自定义的schame 实现基于数据库的认证

通常来说, Spring Security 的新用户可能需要适配用户、组和角色到已有的数据库 schema 中。尽管遗留的数据库并不匹配 Spring Security 要求的数据库 schema ,但我们还是可以通过配置 JdbcDaoImpl 来匹配它。

假设我们拥有一个如下图所示的遗留数据库 schema ,要基于它实现 Spring Security



 我们能够很容易地修改 JdbcDaoImpl 的配置来使用这个 schema 并重写我们在 JBCP Pets 中使用的默认 Spring Security 表定义和列。

确定正确的 JDBC SQL 查询

JdbcDaoImpl 有三个 SQL 查询,它们有定义良好的参数和返回列的集合。我们必须机遇它们提供的功能,确定每个查询的 SQL JdbcDaoImpl 的每个 SQL 查询都是使用登录时提供的用户名作为唯一的参数。

查询名

描述

期望得到的 SQL

usersByUsernameQuery

返回匹配用户名的一个或更多的用户。只有返回的第一个用户被使用。

Username (string)

Password (string)

Enabled (Boolean)

authoritiesByUsernameQuery

返回用户被直接授予的权限。一般在 GBAC 禁用时,被使用。

Username (string)

Granted Authority

(string)

groupAuthoritiesByUsernameQuery

返回用户作为组成员被授予的权限和组的详细信息。在 GBAC 功能启用时,被使用。

Group Primary Key

(any)

Group Name (any)

Granted Authority

(string)

要注意的是,在一些场景中返回的列在默认的 JdbcDaoImpl 实现中并没有用到,但我们依旧需要将这些值返回。在进入下一章节前,请花费一点时间尝试写一下基于前面数据库图表中的查询语句。

配置 JdbcDaoImpl 来使用自定义的 SQL 查询

给不规范的数据库使用自定义 SQL 查询,我们需要在 Spring Bean 的配置文件中修改 JdbcDaoImpl 的属性。要注意的一点是,为了给 JdbcDaoImpl 配置 JDBC 查询,我们不能使用 <jdbc-user-service> 声明。必要要明确实例化这个 bean ,如同我们在自定义 JdbcDaoImpl 实现时所作的那样:

 

Xml代码  收藏代码
  1. < bean   id = "jdbcUserService"    
  2.       class = "com.packtpub.springsecurity.security.CustomJdbcDaoImpl" >   
  3.   < property   name = "dataSource"   ref = "dataSource" />   
  4.   < property   name = "enableGroups"   value = "true" />   
  5.   < property   name = "enableAuthorities"   value = "false" />   
  6.   < property   name = "usersByUsernameQuery" >   
  7.     < value > SELECT LOGIN, PASSWORD,   
  8.            1 FROM USER_INFO WHERE LOGIN  = ?   
  9.     </ value >   
  10.   </ property >   
  11.   < property   name = "groupAuthoritiesByUsernameQuery" >   
  12.     < value > SELECT G.GROUP_ID, G.GROUP_NAME, P.NAME   
  13.       FROM USER_INFO U  
  14.       JOIN USER_GROUP UG on U.USER_INFO_ID  =  UG .USER_INFO_ID  
  15.       JOIN GROUP G ON UG.GROUP_ID  = G.GROUP_ID  
  16.       JOIN GROUP_PERMISSION GP ON G.GROUP_ID  =  GP .GROUP_ID  
  17.       JOIN PERMISSION P ON GP.PERMISSION_ID  = P.PERMISSION_ID  
  18.       WHERE U.LOGIN  = ?   
  19.     </ value >   
  20.   </ property >   
  21. </ bean >   

 这是 Spring Security 从已存在且不符合默认 schema 的数据库中读取设置时,唯一需要配置的地方。需要记住的是,在使用已存在的 schema 时,通常会需要扩展 JdbcDaoImpl 以支持修改密码、重命名用户账号以及其他的用户管理功能。

 

如果你使用 JdbcUserDetailsManager 来完成用户管理的任务,这个类使用了大约 20 个可配置的 SQL 查询。请参考 Javadoc 或源码来了解 JdbcUserDetailsManager 使用的默认查询。

分享到:
评论

相关推荐

    Spring Security3中文文档

    ### 第二章:深入理解Spring Security3 本章深入探讨了Spring Security3的内部机制,包括安全过滤器链、认证管理器(Authentication Manager)的工作原理以及如何定制这些组件以满足特定需求。 ### 第三章:高级安全...

    spring security3 中文版本

    #### 二、Spring Security 命名空间配置 ##### 2.1 命名空间的设计 Spring Security 提供了一个简洁的命名空间,用于简化配置过程。这种设计使得开发者可以使用更少的 XML 配置来实现复杂的安全需求。 ##### 2.2 ...

    spring-security3 配置和使用

    Spring Security 3 配置和使用 Spring Security 是一个强大且灵活的安全框架,旨在保护基于 Java 的 Web 应用程序。Spring Security 3 是 Spring Security 框架的第三个主要版本,提供了许多新的功能和改进。下面...

    SpringSecurity 3配置文件

    在本文中,我们将深入探讨Spring Security 3的配置文件,以及如何理解和使用这些配置来增强应用的安全性。 首先,Spring Security的配置通常位于一个或多个XML文件中,这些文件通过`&lt;beans&gt;`标签定义了安全相关的...

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

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

    Spring Security in Action

    Spring Security 实践指南 ...* 高度可配置性:Spring Security 的配置项非常灵活,可以根据实际需求进行配置。 Spring Security 是一个功能强大且灵活的安全框架,广泛应用于 Java 应用开发中。

    《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)附前四章doc文件

    《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...

    spring Security3中文教程,经典的

    ### Spring Security3中文教程知识点概览 #### 一、安全核心概念与起步 Spring Security是Spring框架中的一个重要组成部分,主要用于为Web应用提供安全防护。它不仅提供了强大的认证和授权功能,还支持各种加密...

    spring security3配置和使用实例+教程

    2. **认证配置**:Spring Security 提供了多种认证方式,如基于内存的用户信息、JDBC认证、ldap认证等。通常,你需要配置`authentication-manager`元素,其中包含`user-service`或`jdbc-authentication-provider`等...

    Spring Security 资料合集

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

    springsecurity使用配置详解

    在本文中,我们将深入探讨Spring Security的配置及其在实际应用中的使用。 首先,Spring Security的核心概念包括用户、角色、权限和访问控制。它提供了一种机制来验证用户身份(身份验证),并决定用户是否可以访问...

    Spring Security 3.pdf

    2. **Annotation配置**: 虽然XML是主要配置方式,但Spring Security 3也支持注解配置,允许更简洁的声明式安全设置。`@EnableGlobalMethodSecurity`和`@Secured`注解用于方法级别的安全控制。 三、主要组件 1. **...

    springsecurity学习笔记

    以上只是Spring Security学习过程中的一部分要点,实际上,这个框架非常深奥,包含了许多高级特性,如频道安全、密码存储、国际化的错误消息等。在学习时,建议结合实际项目实践,这样能更好地理解和掌握其工作原理...

    Spring Security3 Demo

    在"SpringSecurity2Demo"这个项目中,我们可以预期看到以下组成部分: 1. **配置文件**: `spring-security.xml`,这是Spring Security的核心配置文件,包含了过滤器链的配置、用户认证源、授权规则等。 2. **控制...

    spring security 3 demos

    "Spring Security 3 Demos" 是一套针对Spring Security 3 版本的示例项目,旨在帮助开发者理解并掌握该框架的基本用法和核心功能。 在这些示例中,你可以学习到以下关键知识点: 1. **身份验证(Authentication)*...

    SpringSecurity.pdf

    Spring Security的配置灵活,可以通过XML配置文件、Java配置类或者注解来定制安全策略。它还提供了大量的扩展点,允许开发者根据自己的业务需求进行定制和扩展。 Spring Security的学习过程可以分为入门、进阶和...

    Spring Security-3中文官方文档(及教程)

    Spring Security 3是中国社区翻译的官方文档,为国内开发者提供了方便的学习资源。 本套文档包含了Spring Security的基础概念、配置、核心组件以及实际应用场景的详细讲解。以下是一些关键知识点的概述: 1. **...

    spring security2配置

    在这个"Spring Security2配置"的主题中,我们将深入探讨如何配置Spring Security来保护我们的应用程序,以及它的一些核心概念。 首先,让我们理解Spring Security的基本组件。`Users.java`、`Roles.java`暗示了用户...

    springSecurity3中文文档

    第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...

    springSecurity3例子

    - Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...

Global site tag (gtag.js) - Google Analytics