后端资源权限控制使用Spring Security权限注解控制,比如下面这个资源只有拥有"user:add"权限的用户可以访问: ``` /** * 保存用户包括角色和部门 * * @param userDto * @return */ @PostMapping @PreAuthorize("hasAuthority('sys:user:add')") public R insert(@RequestBody UserDTO userDto) { return R.ok(userService.insertUser(userDto)); } ``` 如果用户没有这个权限的话,访问该资源会返回403状态码。 ## 如何权限分配 那么,如何才能让用户拥有“user:add”权限? 后端权限模块采用RBAC(**R**ole-**B**ased**A**ccess**C**ontrol,基于角色的访问控制)的架构,简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。系统中的数据表也是基于该模型设计的。 比如,想要让admin这个用户拥有“user:add”权限,数据表就要存在如下关联数据: 1. sys_menu表中存在一个`name`为“新增用户”按钮,`perms`的值为`user:add`,假设这条数据的`menu_id`为1; 2. sys_role表中存在一个角色,该角色的`role_id`为2; 3. sys_role_menu表中存在一条数据,用于关联`menu_id`为1按钮和`role_id`为2的角色; 4. sys_user表中存在一条`user_name`为admin的用户,`user_id`为3; 5. sys_user_role表中存在一条数据,用于关联`user_id`为3的用户和`role_id`为2的角色。 通过上面的步骤,用户admin就拥有了"user:add"权限 ## 有了权限如何访问? 访问后端接口需在请求头中携带token进行访问,请求头格式如下: ``` # JWT参数 # token头部 jwt: header: Authorization tokenHead: 'Bearer ' # Authorization: Bearer 登录时返回的token Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTU1ODk2NzY0OSwiaWF0IjoxNTU4OTQ2MDQ5fQ.jsJvqHa1tKbJazG0p9kq5J2tT7zAk5B6N_CspdOAQLWgEICStkMmvLE-qapFTtWnnDUPAjqmsmtPFSWYaH5LtA ``` 在请求URL头部加上`Authorization`即可