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

 更新时间:2022年01月05日 09:33:52   作者:海威的技术博客  
这篇文章主要给大家介绍了关于SpringBoot如何整合Springsecurity实现数据库登录及权限控制的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

我们今天使用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代码哦,要自己手写代码

然后是一个实现了UserDetialsServer的类

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

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

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

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

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

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

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

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

下面是我的登录页面代码

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

然后我们再看权限功能

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

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

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

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

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

                                            2. 添加角色时加上ROLE_

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

那么该用第几种方法呢?

总结

到此这篇关于SpringBoot如何整合Springsecurity实现数据库登录及权限控制的文章就介绍到这了,更多相关SpringBoot整合Springsecurity实现数据库登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis中#号与美元符号的区别

    MyBatis中#号与美元符号的区别

    #{变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为jdbc的类型。很多朋友不清楚在mybatis中#号与美元符号的不同,接下来通过本文给大家介绍两者的区别,感兴趣的朋友参考下吧
    2017-01-01
  • Java程序执行过程及内存机制详解

    Java程序执行过程及内存机制详解

    本讲将介绍Java代码是如何一步步运行起来的,还会介绍Java程序所占用的内存是被如何管理的:堆、栈和方法区都各自负责存储哪些内容,感兴趣的朋友跟随小编一起看看吧
    2020-12-12
  • 使用ShardingSphere-Proxy实现分表分库

    使用ShardingSphere-Proxy实现分表分库

    这篇文章介绍了使用ShardingSphere-Proxy实现分表分库的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • Java毕业设计实战之在线高中考试系统的实现

    Java毕业设计实战之在线高中考试系统的实现

    这是一个使用了java+SSM+Jsp+Mysql+Maven开发的在线高中考试系统,是一个毕业设计的实战练习,具有考试系统该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02
  • 解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空问题

    解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读

    这篇文章主要给大家介绍了关于如何解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • MyBatis自定义typeHandler的完整实例

    MyBatis自定义typeHandler的完整实例

    这篇文章主要给大家介绍了关于MyBatis自定义typeHandler的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 详解Spring Boot中整合Sharding-JDBC读写分离示例

    详解Spring Boot中整合Sharding-JDBC读写分离示例

    这篇文章主要介绍了详解Spring Boot中整合Sharding-JDBC读写分离示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java AQS 原理与 ReentrantLock 实现方法

    Java AQS 原理与 ReentrantLock 实现方法

    AQS 的作用是解决同步器的实现问题,它将复杂的同步器实现分解为简单的框架方法,开发者只需要实现少量特定的方法就能快速构建出可靠的同步器,这篇文章主要介绍Java AQS原理与ReentrantLock实现,需要的朋友可以参考下
    2025-03-03
  • SpringBoot中MapStruct实现优雅的数据复制

    SpringBoot中MapStruct实现优雅的数据复制

    本文主要介绍了SpringBoot中MapStruct实现优雅的数据复制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • SpringBoot如何整合SpringDataJPA

    SpringBoot如何整合SpringDataJPA

    这篇文章主要介绍了SpringBoot整合SpringDataJPA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论