企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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 配置的身份验证/授权的工作方式。 **祝您学习愉快!**