【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理

时间:2021-11-03 04:13:34

一 自定义表结构

这里还是用的mysql数据库,所以pom.xml文件都不用修改。这里只要新建三张表即可,user表、role表、user_role表。其中user用户表,role角色表为保存用户权限数据的主表,user_role为关联表。user用户表,role角色表之间为多对多关系,就是说一个用户可以有多个角色。ER图如下所示:

【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理

建表语句:

-- 角色
create table role(
    id int PRIMARY KEY AUTO_INCREMENT,
    name ),
    descn )
);

-- 用户
create table user(
    id int PRIMARY KEY AUTO_INCREMENT,
    username ),
    password ),
    status int,
    descn )
);

-- 用户角色连接表
create table user_role(
    user_id int,
    role_id int
);

插入数据:

,,'管理员');
,,'用户');

,'ROLE_ADMIN','管理员角色');
,'ROLE_USER','用户角色');

,);
,);
,);

二 修改Spring Security的配置文件(applicationContext.xml)

现在我们要在这样的数据结构基础上使用Spring Security,Spring Security所需要的数据无非就是为了处理两种情况,一是判断登录用户是否合法,二是判断登陆的用户是否有权限访问受保护的系统资源。因此我们所要做的工作就是在现有数据结构的基础上,为Spring Security提供这两种数据。

在jdbc-user-service标签中有这样两个属性:

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

同时通过代码提示能看到这两个属性的sql语句格式:

【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理

【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理

从图中可以看到第一个属性要的是通过username来查询用户名、密码和是否可用;第二个属性是通过username来查询用户权限,所以在我们自定义的表结构的基础上对sql语句进行修改,这样最终得到的配置文件如下:

  <authentication-manager>
        <authentication-provider>
            <jdbc-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 user.username,role.name from user,role,user_role
                                       where user.id=user_role.user_id and
                                       user_role.role_id=role.id and user.username=?"/>
           </authentication-provider>
    </authentication-manager>

其他的文件和配置和上一章完全一样

三 结果

与上一章一样,通过http://localhost:8801/spring-security03-database_xml来分别验证user和admin用户权限