基于数据库用户认证

实际开发中用户的信息一般存放在数据库表里,所以我们使用元素替代

现使用Mysql数据库演示,表结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE `role` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '角色编号',
`name` varchar(60) NOT NULL COMMENT '角色',
`note` varchar(100) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
);
CREATE TABLE `user` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`username` varchar(60) NOT NULL COMMENT '用户名',
`password` varchar(60) NOT NULL COMMENT '密码',
`status` int(20) NOT NULL COMMENT '状态',
`note` varchar(100) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
);
CREATE TABLE `user_role` (
`role_id` int(20) NOT NULL COMMENT '角色编号',
`user_id` int(20) NOT NULL COMMENT '用户编号',
PRIMARY KEY (`role_id`,`user_id`),
CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `user_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`)
);

插入测试数据:

1
2
3
4
5
6
7
INSERT INTO `role` VALUES ('1', 'ROLE_ADMIN', '管理员角色');
INSERT INTO `role` VALUES ('2', 'ROLE_USER', '用户角色');
INSERT INTO `user` VALUES ('1', 'admin', 'admin', '1', '管理员');
INSERT INTO `user` VALUES ('2', 'user', 'user', '1', '普通用户');
INSERT INTO `user_role` VALUES ('1', '1');
INSERT INTO `user_role` VALUES ('1', '2');
INSERT INTO `user_role` VALUES ('2', '2');

加入spring-jdbc以及mysql-connector依赖:

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>

修改spring-security配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<bean id="datasource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/security?useUnicode=true&characterEncoding=UTF-8"
p:username="root"
p:password="123456"/>
<jdbc-user-service id="user_service"
data-source-ref="datasource"
users-by-username-query="select username,password,status as enabled
from user
where username=?"
authorities-by-username-query="select u.username,r.name as authority
from user u
join user_role ur
on u.id=ur.user_id
join role r
on r.id=ur.role_id
where u.username=?"/>

users-by-username-query为根据用户名查找用户,系统通过传入的用户名查询当前用户的登录名,密码和是否被禁用这一状态。

authorities-by-username-query为根据用户名查找权限,系统通过传入的用户名查询当前用户已被授予的所有权限。

请作者喝瓶肥宅水🥤

0