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 用户服务实现提供了这两个属性,以使用户名与密码匹配,然后使用户名与授予的角色或权限匹配。
- 用户按用户名查询
- 通过用户名查询权限
测试应用程序
现在,在应用程序服务器中再次构建并在应用程序之上运行。 它将完全符合先前教程 中 xml 配置的身份验证/授权的工作方式。
祝您学习愉快!