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 相关文章推荐
分享JavaScript获取网页关闭与取消关闭的事件
Dec 13 Javascript
使用jquery实现以post打开新窗口
Mar 19 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
Javascript闭包用法实例分析
Jan 23 Javascript
jQuery选择器源码解读(二):select方法
Mar 31 Javascript
Angular使用ng-messages与PHP进行表单数据验证
Dec 28 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
Mar 10 Javascript
jQuery带控制按钮轮播图插件
Jul 31 jQuery
详解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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
php实现将Session写入数据库
2015/07/26 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
python对html代码进行escape编码的方法
2015/05/04 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
import的本质解析
2017/10/30 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python+pygame实现坦克大战
2019/09/10 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
学习演讲稿范文
2014/05/10 职场文书
预备党员介绍人意见
2015/06/01 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
Python天气语音播报小助手
2021/09/25 Python
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技