《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代码
<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脚本。
首先,添加组:
Sql代码
insert into groups(group_name) values ('Users');
insert into groups(group_name) values ('Administrators');
接下来,指定角色到组中:
Sql代码
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';
接下来,创建用户:
Sql代码
insert into users(username, password, enabled) values
('admin','admin',true);
insert into users(username, password, enabled) values
('guest','guest',true);
最后,指定用户到组中:
Sql代码
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脚本:
Xml代码
<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 补充:软件开发 , Java ,
访问www.zzzyk.com 试试 CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络, |