2025年rbac权限管理系统(权限管理系统介绍)

rbac权限管理系统(权限管理系统介绍)p id main toc strong 目录 strong p 权限管理系统 通用权限管理系统 所使用的技术 环境要求 后端 主 搭建后端项目环境 mybatis 中自带的逻辑删除 Security 的认证运作流程 前端与后端请求关系图 权限分配 前端 RBAC

大家好,我是讯享网,很高兴认识大家。



 <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&lt;?&gt; getPermissionTree(Long roleId) {

讯享网<span style="color:#7b7f82;">//根据当前用户查询出可划分(拥有)的权限</span> <span style="color:#7b7f82;">//从SpringSecurity上下文获取用户信息</span> Authentication authentication &#61; SecurityContextHolder .getContext() .getAuthentication(); <span style="color:#7b7f82;">//获取用户的信息</span> User user &#61; (User) authentication.getPrincipal(); <span style="color:#7b7f82;">//将当前用户的角色可以分配的所有权限赋给list</span> <span style="color:#7b7f82;">//做正常的权限分布</span> List&lt;Permission&gt; list &#61; new ArrayList&lt;&gt;(); <span style="color:#7b7f82;">//如果当前用户是管理员</span> if(user.isAdmin()){ <span style="color:#7b7f82;">//直接查询所有权限</span> list &#61; permissionService.list(); }else{ <span style="color:#7b7f82;">//否则&#xff1a;当前用户不是管理员&#xff0c;查询当前用户所具有的权限</span> <span style="color:#7b7f82;">//思路&#xff1a;用户 -&gt; UserRole -&gt; RolePermission -&gt; Permission -&gt; id</span> <span style="color:#7b7f82;">//so&#xff0c;先拿到用户id,user_id</span> <span style="color:#7b7f82;">//.eq&#xff1a;拿到的是一个流&#xff0c;把流进行一个map遍历</span> List&lt;Long&gt; user_id &#61; userRoleService .list(new QueryWrapper&lt;UserRole&gt;().eq(&#34;user_id&#34;, user.getId())) .stream().map(UserRole::getRoleId) .collect(Collectors.toList()); <span style="color:#7b7f82;">//RolePermission -&gt; Permission</span> <span style="color:#7b7f82;">//next&#xff0c;通过用户id后拿到角色id,role_id</span> List&lt;Long&gt; role_id &#61; rolePermissionService .list(new QueryWrapper&lt;RolePermission&gt;().in(&#34;role_id&#34;, user_id)) .stream().map(RolePermission::getPermissionId) .collect(Collectors.toList()); <span style="color:#7b7f82;">//Permission -&gt; id //finally&#xff0c;拿到角色所有的权限id,id</span> list &#61; permissionService.list(new QueryWrapper&lt;Permission&gt;().in(&#34;id&#34;, role_id)); } <span style="color:#7b7f82;">//查询出当前要分配的角色的权限 //数据回显,listIds</span> List&lt;Long&gt; role_id &#61; rolePermissionService .list(new QueryWrapper&lt;RolePermission&gt;().in(&#34;role_id&#34;, roleId)) .stream().map(RolePermission::getPermissionId) .collect(Collectors.toList()); <span style="color:#7b7f82;">//得到当前角色所有的权限 id&#xff0c;为了在前端显示权限菜单树之后能被选中 //选出当前角色的权限与要去修改的角色的权限的共有部分</span> List&lt;Long&gt; rps &#61; new ArrayList&lt;&gt;(); <span style="color:#7b7f82;">//做一个权限数的判断</span> if(role_id.size()&gt;0){ rps &#61; permissionService .list(new QueryWrapper&lt;Permission&gt;().in(&#34;id&#34;, role_id)) .stream().map(Permission::getId) .collect(Collectors.toList()); } 

//把需要在前端被选中的权限编号放进去

List&lt;Long&gt; ids &#61; new ArrayList&lt;Long&gt;(); 

//需要获取 list,id 中都存在的共同 id,在前端让它被选中

讯享网List&lt;Long&gt; finalId &#61; rps; list.forEach(p -&gt;{ if(finalId.indexOf(p.getId())!&#61;-1){ ids.add(p.getId()); } }); <span style="color:#7b7f82;">//进行数据的组合</span> RolePermissionVo vo &#61; new RolePermissionVo(); 

//层级赋予

vo.setPermissionList(MenuTree.makeMenuTree(list,0L)); vo.setCheckList(ids); return HttpResult.ok(vo); 

}

首先下载vue-element-admin,需要用到git,如果没有安装git,命令会报错。


小讯
上一篇 2025-04-27 07:22
下一篇 2025-04-19 21:21

相关推荐

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