目录
权限管理系统/通用权限管理系统
所使用的技术
环境要求
后端(主):
搭建后端项目环境
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) { //根据当前用户查询出可划分(拥有)的权限 //从SpringSecurity上下文获取用户信息 Authentication authentication = SecurityContextHolder .getContext() .getAuthentication(); //获取用户的信息 User user = (User) authentication.getPrincipal(); //将当前用户的角色可以分配的所有权限赋给list //做正常的权限分布 List<Permission> list = new ArrayList<>(); //如果当前用户是管理员 if(user.isAdmin()){ //直接查询所有权限 list = permissionService.list(); }else{ //否则:当前用户不是管理员,查询当前用户所具有的权限 //思路:用户 -> UserRole -> RolePermission -> Permission -> id //so,先拿到用户id,user_id //.eq:拿到的是一个流,把流进行一个map遍历 List<Long> user_id = userRoleService .list(new QueryWrapper<UserRole>().eq("user_id", user.getId())) .stream().map(UserRole::getRoleId) .collect(Collectors.toList()); //RolePermission -> Permission //next,通过用户id后拿到角色id,role_id List<Long> role_id = rolePermissionService .list(new QueryWrapper<RolePermission>().in("role_id", user_id)) .stream().map(RolePermission::getPermissionId) .collect(Collectors.toList()); //Permission -> id //finally,拿到角色所有的权限id,id list = permissionService.list(new QueryWrapper<Permission>().in("id", role_id)); } //查询出当前要分配的角色的权限 //数据回显,listIds List<Long> role_id = rolePermissionService .list(new QueryWrapper<RolePermission>().in("role_id", roleId)) .stream().map(RolePermission::getPermissionId) .collect(Collectors.toList()); //得到当前角色所有的权限 id,为了在前端显示权限菜单树之后能被选中 //选出当前角色的权限与要去修改的角色的权限的共有部分 List<Long> rps = new ArrayList<>(); //做一个权限数的判断 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()); } }); //进行数据的组合 RolePermissionVo vo = new RolePermissionVo(); //层级赋予 vo.setPermissionList(MenuTree.makeMenuTree(list,0L)); vo.setCheckList(ids); return HttpResult.ok(vo); }
到此这篇rbac权限管理系统(权限管理系统介绍)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!首先下载vue-element-admin,需要用到git,如果没有安装git,命令会报错。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/jszy-cpgl/18275.html