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

《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 DirectoryAD)是大范围使用GBAC的典型实现,它把AD的用户纳入组中并给组授权权限。通过使用GBAC,能够指数级得简化对大量基于AD组织的权限管理。想一下你所使用软件的安全功能——用户、分组以及权限是如何管理的?这种方式编写安全功能的利弊是什么?】

 

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

配置基于组的授权

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

配置JdbcDaoImpl以使用用户组

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

 

<bean id="jdbcUserService" 
      class="com.packtpub.springsecurity.security.CustomJdbcDaoImpl">
  <property name="dataSource" ref="dataSource"/>
  <property name="enableGroups" value="true"/>
  <property name="enableAuthorities" value="false"/>
</bean>

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

修改初始载入的SQL脚本

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

l  定义我们的组信息;

l  指定GrantedAuthority声明到组中;

l  指定用户到组中。

 

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

首先,添加组:

 

insert into groups(group_name) values ('Users');
insert into groups(group_name) values ('Administrators');
 

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

 

insert into group_authorities(group_id, authority) select id,'ROLE_
USER' from groups where group_name='Users';
insert into group_authorities(group_id, authority) select id,'ROLE_
USER' from groups where group_name='Administrators';
insert into group_authorities(group_id, authority) select id,'ROLE_
ADMIN' from groups where group_name='Administrators';

 接下来,创建用户:

 

insert into users(username, password, enabled) values 
('admin','admin',true);
insert into users(username, password, enabled) values 
('guest','guest',true);

 最后,指定用户到组中:

 

insert into group_members(group_id, username) select id,'guest' from 
groups where group_name='Users';
insert into group_members(group_id, username) select id,'admin' from 
groups where group_name='Administrators';
 

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

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

 

<jdbc:embedded-database id="dataSource" type="HSQL">
  <jdbc:script location="classpath:security-schema.sql"/>
  <jdbc:script location="classpath:test-users-groups-data.sql"/>
</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查询,它们有定义良好的参数和返回列的集合。我们必须机遇它们提供的功能,确定每个查询的SQLJdbcDaoImpl的每个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实现时所作的那样:

 

<bean id="jdbcUserService" 
      class="com.packtpub.springsecurity.security.CustomJdbcDaoImpl">
  <property name="dataSource" ref="dataSource"/>
  <property name="enableGroups" value="true"/>
  <property name="enableAuthorities" value="false"/>
  <property name="usersByUsernameQuery">
    <value>SELECT LOGIN, PASSWORD, 
           1 FROM USER_INFO WHERE LOGIN = ? 
    </value>
  </property>
  <property name="groupAuthoritiesByUsernameQuery">
    <value>SELECT G.GROUP_ID, G.GROUP_NAME, P.NAME 
      FROM USER_INFO U
      JOIN USER_GROUP UG on U.USER_INFO_ID = UG.USER_INFO_ID
      JOIN GROUP G ON UG.GROUP_ID = G.GROUP_ID
      JOIN GROUP_PERMISSION GP ON G.GROUP_ID = GP.GROUP_ID
      JOIN PERMISSION P ON GP.PERMISSION_ID = P.PERMISSION_ID
      WHERE U.LOGIN = ? 
    </value>
  </property>
</bean>

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

 

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

  • 大小: 29.4 KB
  • 大小: 44.1 KB
4
3
分享到:
评论
5 楼 lengyun3566 2011-09-28  
freeboat 写道
找到问题所在了,老的系统中把用户后面都加上了一个"@jlgs",再取用户的时候添加CONCAT(?, '@jlgs')这个,但是在获取权限的时候就不用了,因为ss使用的username已经包含了@jlgs。不知道我这样取得用户在别的权限管理应用中会不会有问题,继续研究。

,实在不行就去跟源码,基本上遇到的问题,关联上源码调试一下就能找到思路
4 楼 freeboat 2011-09-27  
找到问题所在了,老的系统中把用户后面都加上了一个"@jlgs",再取用户的时候添加CONCAT(?, '@jlgs')这个,但是在获取权限的时候就不用了,因为ss使用的username已经包含了@jlgs。不知道我这样取得用户在别的权限管理应用中会不会有问题,继续研究。
3 楼 freeboat 2011-09-27  
遇到一个问题,郁闷了一个下午了,为什么配置完自定义的sql查询之后怎么登陆都说是坏的凭证呢?
	<authentication-manager alias="authenticationManager">
		<authentication-provider user-service-ref="jdbcUserService"/>
	</authentication-manager>

	<beans:bean id="jdbcUserService" class="com.songlai.springsecurity.security.CustomJdbcDaoImpl">
		<beans:property name="dataSource" ref="dataSource"/>
        <beans:property name="enableGroups" value="true"/>
        <beans:property name="enableAuthorities" value="false"/>
        <beans:property name="usersByUsernameQuery">
            <beans:value>
                SELECT username, password, 'true'
                FROM members
                WHERE username = CONCAT(?, '@jlgs')
            </beans:value>
        </beans:property>
        <beans:property name="groupAuthoritiesByUsernameQuery">
            <beans:value>
                SELECT g.id as group_id, g.group_name, a.name
                FROM members m
                JOIN group_members gm ON m.uuid = gm.member_uuid
                JOIN groups g ON gm.group_id = g.id
                JOIN group_authorities ga ON g.id = ga.group_id
                JOIN authorities a ON ga.authority_id = a.id
                WHERE m.username = CONCAT(?, '@jlgs')
            </beans:value>
        </beans:property>
    </beans:bean>

sql 在数据库中都执行成功的
2 楼 lengyun3566 2011-07-27  
stevensinclair 写道
我英文版的重点章节基本上看完了 等待加深了解

呵呵,欢迎提意见
1 楼 stevensinclair 2011-07-26  
我英文版的重点章节基本上看完了 等待加深了解

相关推荐

    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配置和使用实例+教程

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

    springsecurity使用配置详解

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

    《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 Security 资料合集

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

    spring security2配置

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

    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. **控制...

    SpringSecurity.pdf

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

    spring security 3 demos

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

    SpringSecurity笔记,编程不良人笔记

    - OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...

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

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

    spring-security多登录页面配置

    从给定的部分内容来看,我们可以看到这是一个Spring Security的配置文件,使用了Spring Security的XML命名空间。下面是一个示例性的配置片段: ```xml &lt;!-- 允许访问登录页面 --&gt; &lt;!-- 静态资源不受保护 -...

Global site tag (gtag.js) - Google Analytics