《Spring Security3》第四章第二部分翻译(JdbcDaoImpl的高级配置)

JdbcDaoImpl的高级配置

    JdbcDaoImpl拥有众多的可配置选项使其能够在已存在的schema中使用,或对其功能进行更复杂地调整。在不少场景下,极可能咱们只需调整内置UserDetailsService类的配置而不须要写本身的代码html

    有一个很重要的功能就是在用户(User)和权限(GrantedAuthority)之间添加一个隔离层(a level of indirection——找不到更好的译法了),这经过将GrantedAuthority按照逻辑划分红集合即组(group)来实现。用户可以被分配到一个或多个组,而组的成员被赋予了一系列的GrantedAuthority声明。spring

    正如在图中所描述的那样,中间的隔离层使得咱们能够将相同集合的角色分派给不少人,而这只须要指定新用户到存在的组中便可。将这与咱们以前的作法对比,在之前的作法是将GrantedAuthority直接分配给单个的用户。sql

这种将权限进行打包处理的方式可能在如下的场景中用到:数据库

  1. 要将用户分红不一样的组,而组之间有些角色是重叠的;安全

  2. 想要全局地修改一类用户的权限。如,若是你拥有一个“供应商”的分组,而你想要修改他们可否访问应用特定区域的设置;spa

  3. 拥有大量的用户,你不须要用户级别的受权配置。操作系统

除非你的应用用户量颇有限,不然极可能要使用基于组的访问控制。这种管理方式的简便性和扩展性带来的价值远远超过了它稍微增长的复杂性。这种将用户权限集中到组中的技术一般叫作基于组的访问控制Group-Based Access Control ,GBAC)。code

【基于组的访问控制几乎在市面上任何安全的操做系统和软件包中都能看到。微软的活动目录(Active DirectoryAD)是大范围使用GBAC的典型实现,它把AD的用户归入组中并给组受权权限。经过使用GBAC,可以指数级得简化对大量基于AD组织的权限管理。想一下你所使用软件的安全功能——用户、分组以及权限是如何管理的?这种方式编写安全功能的利弊是什么?】xml

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

咱们会为站点添加两个组——普通用户(咱们将其称为“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语句:

  1. 定义咱们的组信息;

  2. 指定GrantedAuthority声明到组中;

  3. 指定用户到组中。

简单起见,咱们声明一个名为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查询都是使用登陆时提供的用户名做为惟一的参数。

要注意的是,在一些场景中返回的列在默认的JdbcDaoImpl实现中并无用到,但咱们依旧须要将这些值返回。在进入下一章节前,请花费一点时间尝试写一下基于前面数据库图表中的查询语句。

配置JdbcDaoImpl来使用自定义的SQL查询

    给不规范的数据库使用自定义SQL查询,咱们须要在Spring Bean的配置文件中修改JdbcDaoImpl的属性。要注意的一点是,为了给JdbcDaoImpl配置JDBC查询,咱们不能使用<jdbc-user-service>声明。必要要明确实例化这个bean,如同咱们在自定义JdbcDaoImpl实现时所做的那样:

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

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

相关文章
相关标签/搜索