目录
  • 第一步
  • 第二步是封装一个自定义的类
  • 第三步, 我们需要判断密码啦
  • 总结


我们今天使用SpringBoot来整合SpringSecurity,来吧,不多BB

首先呢,是一个SpringBoot 项目,连接数据库,这里我使用的是mybaties.mysql, 下面是数据库的表


DROP TABLE IF EXISTS `xy_role`;


CREATE TABLE xy_role (
xyr_id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键id’,
xyr_name char(30) DEFAULT NULL COMMENT ‘角色名称’,
 PRIMARY KEY (xyr_id)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=‘角色’;/*Data for the table xy_role */
insert into xy_role(xyr_id,xyr_name) values
(1,‘ROLE_SUPERADMIN’),
(2,‘网站管理员’),
(3,‘ROLE_SHOPADMIN’);
DROP TABLE IF EXISTS xy_webadmin;
CREATE TABLE xy_webadmin (
xywb_id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键id’,
xywb_username char(30) DEFAULT NULL COMMENT ‘用户名’,
xyr_id int(11) DEFAULT NULL COMMENT ‘角色’,
xywb_password char(50) DEFAULT NULL COMMENT ‘密码’,
xywb_registertime bigint(20) DEFAULT NULL COMMENT ‘注册时间’,
 PRIMARY KEY (xywb_id),
 KEY FK_Reference_37 (xyr_id),
 CONSTRAINT FK_Reference_37 FOREIGN KEY (xyr_id) REFERENCES xy_role (xyr_id)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=‘网站管理员’;/*Data for the table xy_webadmin */
insert into xy_webadmin(xywb_id,xywb_username,xyr_id,xywb_password,xywb_registertime) values
(1,‘haiwei’,1,‘123456’,1983),
(2,‘admin’,3,‘123456’,1983),
(3,‘admin1’,2,‘123456’,NULL);

表创建完了之后呢, 我们就开始写代码了

第一步

我们要创建spring security 的配置文件, 因为代码太长,所以我就直接截图了, 小伙伴们不要想着COPY代码哦,要自己手写代码

springboot security 行级别控制 springboot整合security权限控制_数据库

然后是一个实现了UserDetialsServer的类

这个类主要是实现了loadUserByname方法, 然后我们可以在这个类中注入我们的service 或者直接mapper接口, 然后方法内部根据username获得该用户, 然后再获取这个用户的权限

第二步是封装一个自定义的类

该类实现了UserDetials 接口, 然后里面有用户对象, 角色对象(也可以是一个角色泛型的list集合)这个自定义的类实现了这个几个方法

springboot security 行级别控制 springboot整合security权限控制_主键_02

最重要的是第一个方法, 他会吧当前用户的角色存起来, 只有两段代码 我就不多说了, 下面就是一些账户密码可不可用什么的。

再回头来说我们的loadUserByName方法, 我们把角色和用户都set到这个类里面,然后返回。

这个一步只是验证有没有这个用户,或者是这个账户能不能用

第三步, 我们需要判断密码啦

一个实现了AuthenticationProvider的类, 注入我们的CustmUserService, 然后从Authentication取得账号和密码,调用loadUserByName方法获得账户信息, 再和页面输入的密码进行比对, 如果不能用就抛异常, 如果能用的活,就把账户,账户密码, 账户权限(角色)构建成UsernamePasswordAuthenticationToken返回, 

springboot security 行级别控制 springboot整合security权限控制_数据库_03

下面是我的登录页面代码

springboot security 行级别控制 springboot整合security权限控制_java_04

这就完成了登录功能, 小伙伴们,一定要先按照我的代码写。 然后再自己去写(因为有些东西说的不详细)

然后我们再看权限功能

springboot security 行级别控制 springboot整合security权限控制_java_05

/test1 是只有super_admin才能访问的, /test2 是只有shopping_admin才能访问的(是有缺点的)

当然这里的话 是这样写就行, 我们再看页面上的

springboot security 行级别控制 springboot整合security权限控制_java_06

这里其实是有坑的, 为什么呢, 我们debug查看hasRole的源码

springboot security 行级别控制 springboot整合security权限控制_主键_07

在我标箭头的这里, 如果你网页上写的参数不带ROLE_的话,他会强制给你加上, 然后如果你数据库里面的角色是admin,网页里面写的也是admin, 在这个就会用admin和ROLE_admin 匹配, 然后就不行

我的解决方法目前有两种: 1.数据库里面的角色就加上ROLE_ 

                                            2. 添加角色时加上ROLE_

还有个问题就是第一张图那个的hasRole不能加ROLE_, 如果加了就会报错, 第一个加了没错, 第二个加了就报错了

springboot security 行级别控制 springboot整合security权限控制_主键_08

那么该用第几种方法呢?

总结

到此这篇关于SpringBoot如何整合Springsecurity实现数据库登录及权限控制的文章就介绍到这了,更多相关SpringBoot整合Springsecurity实现数据库登录.