- 浏览: 456032 次
- 性别:
- 来自: 大连
-
博客专栏
-
-
《Spring Secur...
浏览量:385918
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
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声明:
<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查询,它们有定义良好的参数和返回列的集合。我们必须机遇它们提供的功能,确定每个查询的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实现时所作的那样:
<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使用的默认查询。
评论

<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 在数据库中都执行成功的
呵呵,欢迎提意见
发表评论
-
Spring Security 3全文下载
2012-03-15 20:31 20478本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6634附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5419第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 8063第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 5000在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6245第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8661高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12387第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6475明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7254LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6226第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2976属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5442OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7579第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2726典型ACL部署所要考虑的事情 ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(下)
2012-01-17 22:17 4229支持ACL的Spring表达式语言 SpEL对A ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(上)
2012-01-10 22:59 4714高级ACL话题 一些高级的话 ... -
《Spring Security3》第七章第一部分翻译(访问控制列表ACL)
2011-12-30 22:02 9542第七章 访问控制列表(ACL) 在本章中, ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-11-22 22:37 5527认证事件处理 有一个重要的功能只能通 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-11-22 22:25 5549Spring Security基于bean的高级配置 ...
相关推荐
### 第二章:深入理解Spring Security3 本章深入探讨了Spring Security3的内部机制,包括安全过滤器链、认证管理器(Authentication Manager)的工作原理以及如何定制这些组件以满足特定需求。 ### 第三章:高级安全...
#### 二、Spring Security 命名空间配置 ##### 2.1 命名空间的设计 Spring Security 提供了一个简洁的命名空间,用于简化配置过程。这种设计使得开发者可以使用更少的 XML 配置来实现复杂的安全需求。 ##### 2.2 ...
根据给定的信息,我们可以从《Spring Security3 中文版》一书中提炼出多个重要的知识点,主要涉及Spring Security的基础概念、具体实现以及高级配置等方面。下面将详细解释每一部分的关键内容。 ### 第一章:一个不...
#### 第二章:Spring Security起步 - **安全的核心概念**:深入探讨认证与授权等核心概念。 - **认证**:详细介绍认证的过程及其实现方式。 - **授权**:讲解授权的概念以及在Spring Security中的实现方式。 - **三...
第四部分 Web应用程序安全 112 13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的...
#### 第二章:Spring Security 起步 **安全的核心概念** - **认证**:验证用户身份的过程。 - **授权**:根据用户的角色和权限决定其可以访问哪些资源。 **三步之内使我们的应用变得安全** 1. **配置Spring ...