
学习目标:了解ruoyi中的菜单权限并能自定义接口设置权限验证
目录
1.了解菜单权限
进入系统管理、菜单管理里,可以看到有些菜单、目录、按钮是有着权限标识的。

对于前端来说,权限标识是控制当前组件是否给当前用户显示。

对于后端来说,权限标识是控制接口是否给当前用户访问。

1.1 角色权限
在用户管理中 可以看到每个用户有不同的角色,分为admin超级角色和common普通角色

在角色管理中,我们可以为每个角色配置菜单权限

举例:
将普通角色的用户管理菜单权限去除 这样前端菜单应该不会显示用户管理 后端也无法访问用户管理的接口了

我们登录ry这个普通角色账号

左边是修改前,右边是修改后的结果,可以看到 用户管理确实是看不到了


1.2原理解析
接下来我们开始分析
这是admin 超级管理员账号进入页面后执行的代码,可以看到它的permissions是*:* 这代表了所有的权限它都拥有.

而这时common普通用户进入页面后执行的代码, 它的permissions 就是我们之前页面给它勾选的菜单权限,因为我们之前把用户管理的权限去掉了,所以这里面也就没有一个user出现。

不信可以做一个对照组实验。
登录admin账号 对普通角色勾选上用户管理

再次刷新普通用户的页面,可以看到所有的user菜单权限又已经出现了.

页面也已经可见了。

后端代码解析:
sysloginController里 首先获取到当前登录的用户 然后去获取当前用户拥有的菜单权限,最后去比对数据库菜单权限是否一致。

首先判断是否是管理员 如果是则拥有所有权限,如果是其他角色则从数据库中根据角色id获取到对应拥有的菜单权限,最后传给前端。

前端通过调用getrouters获取到当前用户所有的菜单,结合permissions 来进行过滤显示.

2.自定义接口并设置权限验证
对于自定义接口想要对用户进行权限验证,需要使用@PreAuthorize使用自定义权限标识

后端的权限标识应该和前端菜单中的权限字符是一致的。

在前端的学生信息页面中,添加一个按钮,根据是否拥有权限student:interface:test 来决定是否显示。

按钮的方法


在角色管理中 对普通角色添加学生信息,但是不添加自定义接口.

效果是这样的

将我们自定义的按钮勾选上。

成功显示了按钮.

测试接口,成功返回了我们接口的内容


2.1 扩展测试
取消普通角色的权限

同时删除前端的v-haspermi 校验

这样即使没有菜单按钮权限依旧可以显示按钮

此时我们单击按钮,提示没有权限,证明我们的自定义接口权限是没有问题的。


2.2自定义权限标识a:b:c可不可以呢
将权限字符修改成a:b:c

后端标识符修改



可以看到自定义标识权限是a:b:c,接口权限也是没有问题的。

总结:
只要权限标识在 sys_menu.perms 中存在,并分配给角色,就能用于 @ss.hasPermi('xxx') 校验。
就是说只要在菜单管理添加菜单/按钮/目录的时候设置好权限标识,前后端对应好你设置的权限标识,就可以进行正确的权限校验。
2281

被折叠的 条评论
为什么被折叠?



