Spring Security 之 JDBC用户服务示例

在上一篇与Spring 3安全演示应用程序相关的文章中,该示例程序在配置文件中使用默认用户服务,我们了解了如何在登录页面后面保护应用程序。在那篇文章中,用户名和密码存储在application-security.xml文件本身中。现在是时候取消配置这些身份验证参数并将其存储在数据库中了。

有两种方法可以执行此操作,即使用自定义用户服务实现或spring提供的jdbc用户服务。在本文中,我将展示使用第二种方法的方法,即jdbc用户服务。

这篇文章中的部分:

在数据库中创建表
更新安全性配置以使用jdbc用户服务
测试应用

背景资料

除了spring容器中其他内置的用户详细信息服务之外,JDBC用户详细信息实现也是其中之一。使用标签“ jdbc-user-service ”进行配置。

像其他spring功能一样,它也带有可立即使用的默认实现,例如

	<authentication-manager alias="authenticationManager">
		<authentication-provider>
			<jdbc-user-service data-source-ref="dataSource" />
		</authentication-provider>
	</authentication-manager>

以上定义将使用已配置数据库中的默认表。它假定为:

 创建表用户(
      用户名varchar_ignorecase(50)不为null主键,
      密码varchar_ignorecase(50)不为null,
      启用的布尔值不为null);

  创建表授权(
      用户名varchar_ignorecase(50)不为null,
      权限varchar_ignorecase(50)不为null,
      约束fk_authorities_users外键(用户名)引用用户(用户名));
      在权限(用户名,权限)上创建唯一索引ix_auth_username;

但是,在我的示例中,我根据自己的选择创建了两个表,并决定使用sql查询将数据提供给jdbc用户服务。

在数据库中创建表

因此,让我们在数据库中创建我们自己的表:

-----------------------------
-tbl_users的表结构
-----------------------------
如果存在`tbl_users`,则删除表;
创建表` tbl_users`
  `id` int(11)NOT NULL AUTO_INCREMENT,
  `username` varchar(100)NOT NULL,
  `password` varchar(20)NOT NULL,
  `enabled` int(1)NOT NULL,
  主键(`id`)
)ENGINE = InnoDB DEFAULT CHARSET = latin1;

用于存储角色和用户名映射的表。

-----------------------------
-tbl_user_role的表结构
-----------------------------
如果存在则删除表tbl_user_role` ;
创建表`tbl_user_role`(
  `userid` int(11)NOT NULL,
  角色名称varchar(100)非空
)ENGINE = InnoDB DEFAULT CHARSET = latin1;

这些表具有所有必需的信息,例如用户名,密码,启用状态和分配的角色。JDBC用户服务仅对作为参数提供的用户名需要这些值。这些值将通过以下sql查询获取:

选择USERNAME,密码,在1时启用大小写,然后从TBL_USERS WHERE USERNAME =?

+ ---------- + ---------- + --------- +
| USERNAME | 密码| 启用|
+ ---------- + ---------- + --------- +
| 洛奇| 密码 真实|
+ ---------- + ---------- + --------- +

查询以选择角色名称。

选择u.USERNAME,r.ROLENAME
从TBL_USERS u,TBL_USER_ROLE r
u.ID = r.USERID在哪里
AND u.USERNAME = ?;

+ ---------- + ----------- +
| USERNAME | 角色名称|
+ ---------- + ----------- +
| 洛奇| ROLE_USER |
+ ---------- + ----------- +

更新安全性配置以使用jdbc用户服务

可以按照以下步骤进行:

	<authentication-manager alias="authenticationManager">
		<authentication-provider>
			<jdbc-user-service data-source-ref="dataSource"
 
		   users-by-username-query="
		     SELECT USERNAME, PASSWORD, CASE ENABLED WHEN 1 THEN 'true' ELSE 'false' END 'ENABLED' 
		     FROM TBL_USERS 
		     WHERE USERNAME=?;"
 
		   authorities-by-username-query="
		    SELECT u.USERNAME, r.ROLENAME 
			FROM TBL_USERS u, TBL_USER_ROLE r
			WHERE u.ID = r.USERID
			AND u.USERNAME=?;"
 
			/>
		</authentication-provider>
	</authentication-manager>

JDBC用户服务实现提供了这两个属性,以使用户名与密码匹配,然后使用户名与授予的角色或权限匹配。

  1. 用户按用户名查询
  2. 通过用户名查询权限

测试应用

现在,在应用服务器中再次构建并在应用之上运行。它将完全按照上一教程中 xml配置的身份验证/授权的方式运行。

下载源代码

学习愉快!

saigon has written 1440 articles

Leave a Reply