- 浏览: 446891 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:379392
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《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 20107本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6412附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5187第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7793第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4761在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6118第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8572高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12217第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6379明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7080LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6100第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2871属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5315OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7498第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2651典型ACL部署所要考虑的事情 ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(下)
2012-01-17 22:17 4139支持ACL的Spring表达式语言 SpEL对A ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(上)
2012-01-10 22:59 4565高级ACL话题 一些高级的话 ... -
《Spring Security3》第七章第一部分翻译(访问控制列表ACL)
2011-12-30 22:02 9436第七章 访问控制列表(ACL) 在本章中, ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-11-22 22:37 5368认证事件处理 有一个重要的功能只能通 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-11-22 22:25 5382Spring Security基于bean的高级配置 ...
相关推荐
spring security 使用及配置
spring security3 中文版本
第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...
Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf
spring-security3 配置和使用挺有用的。
项目应用到spring3,security3,hibernate4,struts2;应用中涉及到安全认证,目前项目有独立的统一认证网关,所以登录时只需要将安全认证网关的认证后信息塞到spring security中,由security3来管理用户的权限设置。...
Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf
Spring Security 3.1.3配置实例
3、Spring Security 2.x Overview 4、Dive Into Spring Security Authentication Authorization 5、Development Experiences & Demo 6、Q & A 张明星 5年以上保险、电信大中型项目开发经验,对JavaEE有较深入理解...
spring security spring security 中文文档
springsecurity使用配置详解,压缩包里包含主要的代码和详细的word文件说明。
简单的 springSecurity3例子代码
spring security配置实例
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:此项目运行不...
Spring Security 2 配置精讲
(4)项目除了security3的配置使用XML以外,其他基本使用注解配置完成 (5)项目采用的是5张数据表结构。前台及后台各采用了5张数据库表。当然你也可以进行修改后合并。 (6)数据库采用MYSQL 备份文件在src文件夹下...
spring security 2 配置说明
spring cloud2.0 eureka server spring security配置,与spring cloud1.X还是有很大区别
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
Spring Security 3 与 CAS单点登录配置.doc