第(4)节,我们已经对代码生器生成的界面“我的岗位管理”进行了优化,可以看到,与原eladmin的“岗位管理”基本一致,现在我们来看看eladmin是怎么定义权限控制的,并且如何应用到自己的界面当中。

1. 权限注解理解

首先用IDEA打开后端“我的岗位管理”的gen模块中的rest层(也就是Controller层),如下图:
在这里插入图片描述

可以看到标红的注解@PreAuthorize("@el.check(‘myJob:list’)"),这是什么意思呢?在IDEA环境下,按住ctrl键点击@el.check,可以看到源代码如下:
在这里插入图片描述
这里看到注解对应函数check()中定义了一个elPermissions,它是一个List类型,由源代码的定义很容易可以推断出,它就是获取当前登录用户具有的权限,这个权限放在List集合中。再观察return 的内容,elPermissions.contains(“admin”) || Arrays.stream(permissions).anyMatch(elPermissions::contains),这是一个"或"的表达式,只要满足其一就可以通过,通过英文可以推断:

  • elPermissions.contains(“admin”) 表明只要是超级管理员admin就判断为true,admin具有一切权限;
  • Arrays.stream(permissions).anyMatch(elPermissions::contains)表明只要登录用户具有”myJob:list“这个权限就判断为true
    咱们来打个断点debug一下,看看是否推断正确,断点位置如下图:
    在这里插入图片描述

以admin身份登录

用户名:admin,密码:123456,admin登录后进入主页按下图点击
在这里插入图片描述

进入后台debug界面,看看 elPermissions.contains(“admin”)计算的结果,选中标红的" elPermissions.contains(“admin”)"按右键点击Evaluaute Expression,点击Evaluate可以得到true

在这里插入图片描述
在这里插入图片描述
这说明超级管理员的具有一切权限。

以test 身份登录

退出系统,用户名: test ,密码:123456,test登录后按下图点击
在这里插入图片描述
进入后端debug界面,可以看到elPermissions到底指什么,其实就是test用户所携带的一些权限
在这里插入图片描述
我们再来看看Arrays.stream(permissions).anyMatch(elPermissions::contains)计算的结果,如下图
在这里插入图片描述
因为test携带”myJob:list“,因此在经过注解@PreAuthorize("@el.check(‘myJob:list’)")对应的函数时,就可以通过。这下就全明白了。

2. 用户如何携带权限

首先应该了解用户的权限对应数据库中的哪一张表,eladmin官方的后端手册指明权限的设置其实是通过“用户-角色-菜单”这样的 的授权模型,官方给出了图解:
在这里插入图片描述
我做了标识,其实权限就存在于数据表sys_menu的permission字段中,在SQLyogEnt中我用嵌套sql语句选出了"我的岗位管理"对应的所有权限:
sql语句为:

SELECT * FROM sys_menu WHERE pid = (SELECT menu_id FROM sys_menu WHERE title = "我的岗位管理") OR menu_id = (SELECT menu_id FROM sys_menu WHERE title = "我的岗位管理")

对应的权限如下:
在这里插入图片描述

3. 界面如何添加权限

比如给"我的岗位新增”界面添加myJob:add权限,如何操作?其实很简单,还是在菜单管理界面,新增一个菜单,按下图进行填写
在这里插入图片描述
然后在角色管理菜单中给普通用户分配刚刚定义的"我的岗位新增”菜单即可, test 属性于普通用户(可以在用户管理界面中查看)
在这里插入图片描述

4. 后端验证一下

我们首先在后端对"myJob:list"进行修改,改为**“myJob:list123”**
在这里插入图片描述
然后以test 身份登录,进入“我的岗位管理”界面,出现如下结果:
在这里插入图片描述
说明权限设置成功。

5.总结

eladmin的这一套权限控制,我们可以在实际的项目中用起来,主要还是使用Spring Security机制,当然shiro框架也可以实现,但是既然想好好学习eladmin,就应该掌握它的一套思想,同时把eladmin中的一些好的类和函数复用到自己的项目中,这才是站在巨人的肩膀上。如果看完觉得有收获,请给我点赞!你们的支持是我更新的动力,下节课还有更重要的内容,敬请期待!让我们一起学习eladmin,一起进步!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐