Spring Security – JDBC 用户服务示例

Spring Security – JDBC 用户服务示例

原文: https://howtodoinjava.com/spring-security/jdbc-user-service-based-spring-security-example/

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

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

Sections in this post:

Create tables in database
Update security configuration to use jdbc user service
Test the application

背景信息

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

就像其他 spring 功能一样,这也附带了可以使用的默认实现,例如

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

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

 create table users(
      username varchar_ignorecase(50) not null primary key,
      password varchar_ignorecase(50) not null,
      enabled boolean not null);

  create table authorities (
      username varchar_ignorecase(50) not null,
      authority varchar_ignorecase(50) not null,
      constraint fk_authorities_users foreign key(username) references users(username));
      create unique index ix_auth_username on authorities (username,authority);

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

在数据库中创建表

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

-- ----------------------------
-- Table structure for `tbl_users`
-- ----------------------------
DROP TABLE IF EXISTS `tbl_users`;
CREATE TABLE `tbl_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `password` varchar(20) NOT NULL,
  `enabled` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

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

-- ----------------------------
-- Table structure for `tbl_user_role`
-- ----------------------------
DROP TABLE IF EXISTS `tbl_user_role`;
CREATE TABLE `tbl_user_role` (
  `userid` int(11) NOT NULL,
  `rolename` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

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

SELECT USERNAME, PASSWORD, CASE ENABLED WHEN 1 THEN 'true' ELSE 'false' END 'ENABLED' FROM TBL_USERS WHERE USERNAME=?;

+----------+----------+---------+
| USERNAME | PASSWORD | ENABLED |
+----------+----------+---------+
| lokesh   | password | true    |
+----------+----------+---------+

查询以选择角色名称。

SELECT u.USERNAME, r.ROLENAME
FROM TBL_USERS u, TBL_USER_ROLE r
WHERE u.ID = r.USERID
AND u.USERNAME=?;

+----------+-----------+
| USERNAME | ROLENAME  |
+----------+-----------+
| lokesh   | 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 配置的身份验证/授权的工作方式。

祝您学习愉快!