SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

发布时间:2022-01-05 11:06:12 作者:小新
来源:亿速云 阅读:147

这篇文章主要为大家展示了“SpringBoot怎么整合Springsecurity实现数据库登录及权限控制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot怎么整合Springsecurity实现数据库登录及权限控制”这篇文章吧。

首先呢,是一个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怎么整合Springsecurity实现数据库登录及权限控制

然后是一个实现了UserDetialsServer的类

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

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

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

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

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

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

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

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

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

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

下面是我的登录页面代码

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

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

然后我们再看权限功能

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

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

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

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

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

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

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

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

                                            2. 添加角色时加上ROLE_

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

SpringBoot怎么整合Springsecurity实现数据库登录及权限控制

以上是“SpringBoot怎么整合Springsecurity实现数据库登录及权限控制”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. Mac下如何部署springBoot项目到Docker中
  2. SpringBoot+SpringSecurity+jwt整合的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot springsecurity

上一篇:python如何实现将天气预报可视化

下一篇:如何实现python图片格式转换脚本

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》