第 44 章 使用用户组

Spring Security提供了用户组机制,可以将多个用户归纳在一个组中,进行统一授权。下面我们来研究一下如何在数据库中使用用户组保存用户的权限信息。

44.1. 数据库结构

在原数据库的基础上添加用户组所需的三张表:

create table groups (
    id bigint generated by default as identity(start with 0) primary key,
    group_name varchar_ignorecase(50) not null
);

create table group_authorities (
    group_id bigint not null,
    authority varchar(50) not null,
    constraint fk_group_authorities_group foreign key(group_id) references groups(id)
);

create table group_members (
    id bigint generated by default as identity(start with 0) primary key,
    username varchar(50) not null,
    group_id bigint not null,
    constraint fk_group_members_group foreign key(group_id) references groups(id)
);
        

ER图如下所示:

用户组ER图

图 44.1. 用户组ER图


下面开始初始化数据:

insert into users(username,password,enabled) values('admin','admin',true);1
insert into users(username,password,enabled) values('user','user',true);

insert into groups(id,group_name) values(1,'admin');2
insert into groups(id,group_name) values(2,'user');

insert into group_authorities(group_id,authority) values(1,'ROLE_ADMIN');3
insert into group_authorities(group_id,authority) values(2,'ROLE_USER');

insert into group_members(id,username,group_id) values(1,'admin',1);4
insert into group_members(id,username,group_id) values(2,'admin',2);
insert into group_members(id,username,group_id) values(3,'user',2);
        

1

创建两个用户admin和user。

2

创建两个组admin和user。

3

为用户组授权,让admin组中的所有用户都拥有ROLE_ADMIN权限,user组中的所有用户都拥有ROLE_USER权限。

4

admin用户加入admin和user两个用户组,将user用户加入user用户组。

44.2. 修改配置文件

为jdbc-user-service添加一个参数就可以打开用户组功能。

<authentication-provider>
    <jdbc-user-service data-source-ref="dataSource"
        group-authorities-by-username-query="
            SELECT g.id, g.group_name, ga.authority
              FROM groups g, group_members gm, group_authorities ga
             WHERE gm.username = ?
               AND g.id = ga.group_id
               AND g.id = gm.group_id"/>
</authentication-provider>
        

这样系统就会使用这条sql语句从用户组表中查询用户拥有的权限。

之后可以启动实例,使用admin和user用户测试授权情况。

实例在ch212中。