## 后端控制 后端资源权限控制使用Spring Cloud Security权限注解控制,比如下面这个资源只有拥有"user:add"权限的用户可以访问: ```java @PostMapping @PreAuthorize("hasAnyAuthority('user:add')") public void addUser(User user) throws FebsException { this.userService.createUser(user); } ``` 如果用户没有这个权限的话,访问该资源会返回403状态码。 更多注解可以参考:[更多可用注解](https://mrbird.cc/Spring-Security%E4%BF%9D%E6%8A%A4%E6%96%B9%E6%B3%95.html)。 ## 前端控制 前端系统中提供了Vue权限指令,比如只有拥有"user:add"权限的用户才能看到下面这个按钮: ```html <button v-has-permission="['user:add']">新增用户</button> ``` 前端系统中,可用的Vue权限指令有: 指令 | 含义| 示例 ---|---|--- v-hasPermission | 当用户拥有列出的权限的时候,渲染该元素 |`<template v-hasPermission="'user:add','user:update'"><span>hello</span></template>` v-hasAnyPermission | 当用户拥有列出的任意一项权限的时候,渲染该元素 |`<template v-hasAnyPermission="'user:add','user:update'"><span>hello</span></template>` v-hasNoPermission | 当用户不包含列出的的任意一项权限的时候,渲染该元素 |`<template v-hasNoPermission ="'user:add','user:update'"><span>hello</span></template>` > 记住一点,前端的权限控制只是为了提升用户体验,即使前端按钮隐藏了,但如果心怀叵测者知道了后端资源地址的话,还是可以直接访问该资源,所以后端资源的权限控制才是“真正的权限控制”。 ## 权限分配 那么,如何才能让用户拥有“user:add”权限? 后端权限模块采用RBAC(**R**ole-**B**ased **A**ccess **C**ontrol,基于角色的访问控制)的架构,简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。系统中的数据表也是基于该模型设计的。 比如,想要让MrBird这个用户拥有“user:add”权限,数据表就要存在如下关联数据: 1. t_menu表中存在一个`menu_name`为“新增用户”按钮,`perms`的值为`user:add`,假设这条数据的`menu_id`为1; 2. t_role表中存在一个角色,该角色的`role_id`为2; 3. t_role_menu表中存在一条数据,用于关联`menu_id`为1按钮和`role_id`为2的角色; 4. t_user表中存在一条`user_name`为MrBird的用户,`user_id`为3; 5. t_user_role表中存在一条数据,用于关联`user_id`为3的用户和`role_id`为2的角色。 通过上面的步骤,用户MrBird就拥有了"user:add"权限。所以后端系统模块接口无非就是围绕着这点实现的增删改查罢了。