持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天rbac角色权限表设计,点击查看活动详情
权限控制之角色
在阐述完若依框架中的菜单后,我们来看一下若依系统中的角色是如何设计的。
前端
在前端页面上,系统管理->角色管理中,我们可以看到其角色管理的主页面:
点击新增,我们来看一下一个角色需要配置什么信息:
除名称外,另外两个比较值得关注的,一个是菜单权限UI界面,一个是权限字符,我们分别来看。
权限字符
权限字符,我们展开label前面的提示信息:
控制器中定义的权限字符,如@PreAuthorize(@ss.hasRole("admin"))
可见,权限字符是可以做到后端接口权限控制的。
对于其中的PreAuthorize注解rbac角色权限表设计,我们稍后展开来讲。
菜单权限
这个也很好理解,就是该角色拥有查看哪些目录、菜单以及按钮的权限。
角色分配
我们再来看一下若依系统中是如何给用户分配角色的。
用户管理部分分配角色
可以在用户管理版块给用户分配角色,并且该处可以给一个用户分配多个角色。如下图:
角色管理部分分配用户
如下图所示,点击某个角色后面的更多按钮,在下拉框中点击“分配用户”音乐,在分配用户界面去多选用户批量给一个角色分配用户。
经过测试,两个版块的操作数据是互通的。
PreAuthorize
接下来,我们阐述一下Spring-Security中的注解PreAuthorize。
该方法是在方法调用前进行权限检查。
比如,我们找到若依系统中的一个样例:
/**
* 查询代码生成列表
*/
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
@GetMapping("/list")
public TableDataInfo genList(GenTable genTable)
{
startPage();
List list = genTableService.selectGenTableList(genTable);
return getDataTable(list);
}
我们可以点击查看hasPermi方法,查看其执行逻辑:
/**
* RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母
*
* @author ruoyi
*/
@Service("ss")
public class PermissionService
{
/**
* 验证用户是否具备某权限
*
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
public boolean hasPermi(String permission)
{
if (StringUtils.isEmpty(permission))
{
return false;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
{
return false;
}
return hasPermissions(loginUser.getPermissions(), permission);
}
通俗的说,hasPermi就是判断当前登录用户是否拥有某个权限,有则返回true,无此权限则返回false。
角色表设计
若依系统中的角色表为sys_role,我们来大致看一下其中的字段设计: