# Spring Security – JDBC 用户服务示例

> 原文： [https://howtodoinjava.com/spring-security/jdbc-user-service-based-spring-security-example/](https://howtodoinjava.com/spring-security/jdbc-user-service-based-spring-security-example/)

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

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

```java
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 功能一样，这也附带了可以使用的默认实现，例如

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

```

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

```java
 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 用户服务。

## **在数据库中创建表**

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

```java
-- ----------------------------
-- 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;
```

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

```java
-- ----------------------------
-- 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 查询获取：

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

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

查询以选择角色名称。

```java
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 用户服务**

可以按照以下步骤进行：

```java
	<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.  通过用户名查询权限

## **测试应用程序**

现在，在应用程序服务器中再次构建并在应用程序之上运行。 它将完全符合[**先前教程**](https://howtodoinjava.com/spring/spring-security/login-form-based-spring-3-security-example/) 中 xml 配置的身份验证/授权的工作方式。

**祝您学习愉快！**