SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法


Posted in Javascript onJanuary 09, 2018

当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异。笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助。本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究。另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个V部落开源项目 在运行),因此小伙伴们只能将就看一下下面的截图了,文末有部署教程,部署到本地也可以查看完整效果。

本文我们先不聊具体实现,我先来介绍一下我这个权限管理模块的一个整体架构,以及最终呈现出来的效果。

数据库设计

权限数据库主要包含了五张表,分别是资源表、角色表、用户表、资源角色表、用户角色表,数据库关系模型如下:

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法 

关于这个表,我说如下几点:

1.hr表是用户表,存放了用户的基本信息。

2.role是角色表,name字段表示角色的英文名称,按照SpringSecurity的规范,将以 ROLE_ 开始,nameZh字段表示角色的中文名称。

3.menu表是一个资源表,该表涉及到的字段有点多,由于我的前端采用了Vue来做,因此当用户登录成功之后,系统将根据用户的角色动态加载需要的模块,所有模块的信息将保存在menu表中,menu表中的path、component、iconCls、keepAlive、requireAuth等字段都是Vue-Router中需要的字段,也就是说menu中的数据到时候会以json的形式返回给前端,再由vue动态更新router,menu中还有一个字段url,表示一个url pattern,即路径匹配规则,假设有一个路径匹配规则为 /admin/** ,那么当用户在客户端发起一个 /admin/user 的请求,将被 /admin/** 拦截到,系统再去查看这个规则对应的角色是哪些,然后再去查看该用户是否具备相应的角色,进而判断该请求是否合法。

下图分别是用户表、角色表以及资源表中的部分数据(数据库脚本可以在文末的项目地址中下载,位置 resources/vhr.sql ):

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

整体效果

首先,不同的用户在登录成功之后,根据不同的角色,会看到不同的系统菜单,完整菜单如下:

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法 

不同用户登录上来之后,可能看到的会有差异,如下:

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法 

每个用户的角色是由系统管理员进行分配的,系统管理员给用户分配角色的页面如下:

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法 

系统管理员也可以管理不同角色可以操作的资源,页面如下:

SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法 

其他的删除、搜索等一些琐碎的功能我这里就不再一一介绍了。

项目地址

由于商业协议,原本的项目不能共享给各位小伙伴,因此我专门做了一个开源项目,这个项目的功能整体来说比较多,但是考虑到这个系列的文章主要是向大家介绍权限管理模块,因此其他模块都被我暂时阉割掉了,不过小伙伴们可以放心,权限管理模块的代码一行都没有删除,涉及到权限管理的代码和数据都是完整的,可以直接运行的。小伙伴将以管理员的身份登录到后台系统,登录成功之后,依次点击 系统管理->基础信息设置->权限组 ,即可配置不同角色可以操作的资源;然后依次点击 系统管理->操作员管理 ,即可管理每一位操作员的角色。

项目地址: https://github.com/lenve/vhr

快速部署

1.clone项目到本地 git@github.com:lenve/vhr.git

2.数据库脚本放在hrserver项目的resources目录下,在MySQL中执行数据库脚本

3.数据库配置在hrserver项目的resources目录下的application.properties文件中

4.在IntelliJ IDEA中运行hrserver项目

OK,至此,服务端就启动成功了,此时我们直接在地址栏输入 http://localhost:8082/index.html 即可访问我们的项目,如果要做二次开发,请继续看第五、六步。

5.进入到vuehr目录中,在命令行依次输入如下命令:

# 安装依赖
npm install
# 在 localhost:8080 启动项目
npm run dev

由于我在vuehr项目中已经配置了端口转发,将数据转发到SpringBoot上,因此项目启动之后,在浏览器中输入 http://localhost:8080 就可以访问我们的前端项目了,所有的请求通过端口转发将数据传到SpringBoot中(注意此时不要关闭SpringBoot项目)。

6.最后可以用WebStorm等工具打开vuehr项目,继续开发,开发完成后,当项目要上线时,依然进入到vuehr目录,然后执行如下命令:

npm run build

该命令执行成功之后,vuehr目录下生成一个dist文件夹,将该文件夹中的两个文件static和index.html拷贝到SpringBoot项目中resources/static/目录下,然后就可以像第4步那样直接访问了。

步骤5中需要大家对NodeJS、NPM等有一定的使用经验,不熟悉的小伙伴可以先自行搜索学习下,推荐 Vue官方教程 。

注意事项

再次强调,这只是一个权限管理功能模块,运行后只有权限管理功能是完整的。小伙伴们在本地部署成功之后,可以修改每一个用户的角色以及每一个角色可以操作的资源,修改成功之后,注销登录,再以被修改的用户身份登录,即可看到菜单变化。

总结

以上所述是小编给大家介绍的SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery ready函数滥用分析
Feb 16 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
Aug 10 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
jQuery 判断是否包含在数组中Array[]的方法
Aug 03 Javascript
详解angular element()方法使用
Apr 08 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
Sep 03 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
Aug 06 Javascript
vue 验证两次输入的密码是否一致的方法示例
Sep 29 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 Javascript
原生JavaScript实现留言板
Jan 10 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
Jan 09 #Javascript
详解webpack babel的配置
Jan 09 #Javascript
webpack+vue2构建vue项目骨架的方法
Jan 09 #Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
Jan 09 #Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
Jan 09 #Javascript
Gulp实现静态网页模块化的方法详解
Jan 09 #Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
Jan 09 #Javascript
You might like
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
Python转码问题的解决方法
2008/10/07 Python
Python给图像添加噪声具体操作
2019/03/03 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
实习单位推荐信范文
2013/11/27 职场文书
入党转正介绍人意见
2015/06/03 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
小学校长开学致辞
2015/07/29 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书