- 浏览: 307813 次
-
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
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 使用的默认查询。
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 10852、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 983最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2713作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1083一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3473不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1756笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1364认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1080Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 1053手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1263理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4238Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1550实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1151第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 1077方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 914保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 1037使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 1005实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 960第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1296将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1828你是否愿意在密码上添加点salt ? 如果安 ...
相关推荐
### 第二章:深入理解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 ...