<p id="main-toc"><strong>目录</strong></p>
讯享网
权限管理系统/通用权限管理系统
所使用的技术
环境要求
后端(主):
搭建后端项目环境
mybatis中自带的逻辑删除
Security的认证运作流程
前端与后端请求关系图
权限分配
前端
——RBAC(Role-Based Access Control)
RBAC权限模型,即:基于角色的权限控制,模型中有几个关键的术语:
用户:系统接口及访问的操作者。
权限:能够访问某接口或者做某操作的授权资格。
角色:具有一类相同操作权限的用户的总称。
一个用户拥有一个角色,一个角色拥有多个权限。
自主访问控制(DAC:Discretionary Access Control)
强制访问控制(MAC:Mandatory Access Control)
基于属性的权限验证(ABAC:Attribute-Based Control)
后端:spring Boot、Mybatis Plus、Spring Security、Jwt、Redis、MySql
前端:HTML5、CSS3、JavaScript、Vue、Element UI
其他:git
后端 : jdk 8 + maven 3.6 Spring Boot 2+
开发工具:idea git
前端: node.js 开发工具:WebStorm git
搭建后端项目环境
①所需的依赖
②实体类的生成
③Mapper、Service、Controller生成
注:在每个Service实现类上加入@Transaction注解。
④封装统一结果类

HttpResult
讯享网
HttpResultEnum
⑤编写MyBatis Plus配置类
讯享网
⑥接口代码测试

编写一个controller接口。
⑦编写跨域请求
mybatis中自带的逻辑删除
#isDelete:在.yml文件中,所有具备了isDelete的类都不能在数据库中被删除;也就意味着,如果我进行了删除,它会将数据库的isDelete字段从0变成1。
讯享网
#mybatis中的高级的特性
乐观锁:给数据库里的每一个字段增加一个数字,用来预判对一条数据同时进行两种操作,避免这种情况。
Security的认证运作流程
当要访问登录时,会被拦截器或是过滤器给拦住,然后跳转到UserDetailService,根据用户名查询到用户的信息;
然后转到security里面去,认证处理器,这个验证时看不见的;是由它自己去做的,在SpringSecurityConfig里有一个额外的配置:认证处理器,会将查询到的用户与当前传进来的加密完成之后的密码做对比,只要两个属性都过了就代表认证成功;
经过认证之后,就会跳转到对应的handler里去;
如果认证失败了,就会跳转到handler中的认证失败LoginFailureHandler里去;很多情况都会导致认证失败。
在认证的时候,UserController里的任何代码都不影响,就返回了个结果,但此结果也不是最终要用的,这个请求在认证流程中发生了转发,转发到UserDetailService去了,所以最终的结果不再是controller的结果了,而是handler的结果。

前端与后端请求关系图

权限分配
分配权限前需要回显当前角色拥有的权限信息。
但我点击了权限分配,需要先把后端的权限全部拿过来;拿完后端的权限之后,还要拿出所有当前角色对应的权限;在分配角色的权限信息的时候,不能超出当前用户所拥有的权限信息。
查询当前登录用户的信息,判断此用户是否是管理员,如果是管理员的话,就把所有的权限信息全查出来;如果此用户不是管理员,那就根据当前用户的id查询出他所拥有的全部权限信息。
@GetMapping(“/getPermissionTree”) public HttpResult<?> getPermissionTree(Long roleId) {
讯享网<span style="color:#7b7f82;">//根据当前用户查询出可划分(拥有)的权限</span> <span style="color:#7b7f82;">//从SpringSecurity上下文获取用户信息</span> Authentication authentication = SecurityContextHolder .getContext() .getAuthentication(); <span style="color:#7b7f82;">//获取用户的信息</span> User user = (User) authentication.getPrincipal(); <span style="color:#7b7f82;">//将当前用户的角色可以分配的所有权限赋给list</span> <span style="color:#7b7f82;">//做正常的权限分布</span> List<Permission> list = new ArrayList<>(); <span style="color:#7b7f82;">//如果当前用户是管理员</span> if(user.isAdmin()){ <span style="color:#7b7f82;">//直接查询所有权限</span> list = permissionService.list(); }else{ <span style="color:#7b7f82;">//否则:当前用户不是管理员,查询当前用户所具有的权限</span> <span style="color:#7b7f82;">//思路:用户 -> UserRole -> RolePermission -> Permission -> id</span> <span style="color:#7b7f82;">//so,先拿到用户id,user_id</span> <span style="color:#7b7f82;">//.eq:拿到的是一个流,把流进行一个map遍历</span> List<Long> user_id = userRoleService .list(new QueryWrapper<UserRole>().eq("user_id", user.getId())) .stream().map(UserRole::getRoleId) .collect(Collectors.toList()); <span style="color:#7b7f82;">//RolePermission -> Permission</span> <span style="color:#7b7f82;">//next,通过用户id后拿到角色id,role_id</span> List<Long> role_id = rolePermissionService .list(new QueryWrapper<RolePermission>().in("role_id", user_id)) .stream().map(RolePermission::getPermissionId) .collect(Collectors.toList()); <span style="color:#7b7f82;">//Permission -> id //finally,拿到角色所有的权限id,id</span> list = permissionService.list(new QueryWrapper<Permission>().in("id", role_id)); } <span style="color:#7b7f82;">//查询出当前要分配的角色的权限 //数据回显,listIds</span> List<Long> role_id = rolePermissionService .list(new QueryWrapper<RolePermission>().in("role_id", roleId)) .stream().map(RolePermission::getPermissionId) .collect(Collectors.toList()); <span style="color:#7b7f82;">//得到当前角色所有的权限 id,为了在前端显示权限菜单树之后能被选中 //选出当前角色的权限与要去修改的角色的权限的共有部分</span> List<Long> rps = new ArrayList<>(); <span style="color:#7b7f82;">//做一个权限数的判断</span> if(role_id.size()>0){ rps = permissionService .list(new QueryWrapper<Permission>().in("id", role_id)) .stream().map(Permission::getId) .collect(Collectors.toList()); }
//把需要在前端被选中的权限编号放进去
List<Long> ids = new ArrayList<Long>();
//需要获取 list,id 中都存在的共同 id,在前端让它被选中
讯享网List<Long> finalId = rps; list.forEach(p ->{ if(finalId.indexOf(p.getId())!=-1){ ids.add(p.getId()); } }); <span style="color:#7b7f82;">//进行数据的组合</span> RolePermissionVo vo = new RolePermissionVo();
//层级赋予
vo.setPermissionList(MenuTree.makeMenuTree(list,0L)); vo.setCheckList(ids); return HttpResult.ok(vo);
}
首先下载vue-element-admin,需要用到git,如果没有安装git,命令会报错。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/194747.html