RBAC权限管理系统

目录

权限管理系统/通用权限管理系统

所使用的技术

环境要求

后端(主):

搭建后端项目环境

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

@Data
@Accessors(chain = true)
public class HttpResult<T> {

    private Integer code;
    private String message;
    private T data;

    private HttpResult(HttpResultEnum resultEnum, T data) {
        this.code = resultEnum.code;
        this.message = resultEnum.message;
        this.data = data;
    }

    public static HttpResult ok() {
        return new HttpResult(HttpResultEnum.SUCCESS, null);
    }

    public static <T> HttpResult ok(T data) {
        return new HttpResult(HttpResultEnum.SUCCESS, data);
    }

    public static <T> HttpResult error() {
        return new HttpResult(HttpResultEnum.FAILURE, null);
    }

    public static <T> HttpResult error(HttpResultEnum resultEnum) {
        return new HttpResult(resultEnum, null);
    }

    public static <T> HttpResult unknow() {
        return new HttpResult(HttpResultEnum.UNKNOWN, null);
    }
}

         HttpResultEnum

@AllArgsConstructor
public enum HttpResultEnum {
    SUCCESS(200, "操作成功"),
    FAILURE(500, "操作失败"),
    UNKNOWN(600, "未知错误,请反馈给管理员"),
    NO_PERMISSION(700, "无权限访问,请联系管理员"),
    ANONYMOUS_CASE(800, "匿名用户无权限访问"),
    ACCOUNT_EXPIRED(10001, "账户过期,登录失败"),
    BAD_CREDENTIALS(10002, "用户名或密码错误,登录失败"),
    CREDENTIALS_EXPIRED(10003, "密码过期,登录失败"),
    ACCOUNT_DISABLED(10004, "账户被禁用,登录失败"),
    ACCOUNT_LOCKED(10005, "账户被锁,登录失败"),
    ACCOUNT_INTERNAL_AUTHENTICATION(10006, "账户不存在,登录失败"),
    ;
    public Integer code;
    public String message;
}

⑤编写MyBatis Plus配置类

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new
                PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

⑥接口代码测试

        编写一个controller接口。

⑦编写跨域请求

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
            .addMapping("/**")
            .allowedMethods("*")
            .allowedOrigins("*")
            .allowedHeaders("*");
    }
}

mybatis中自带的逻辑删除

#isDelete:在.yml文件中,所有具备了isDelete的类都不能在数据库中被删除;也就意味着,如果我进行了删除,它会将数据库的isDelete字段从0变成1

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDelete
      logic-delete-value: 1
      logic-not-delete-value: 0

#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);
}

前端

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RBAC(Role-Based Access Control)是一种权限管理模型,它是建立在角色的基础上,将用户分配给角色,再根据角色的权限授予对应的资源访问权限。这种模型可以有效地管理大规模应用系统中的权限问题。下面是基于RBAC权限管理系统的设计分析: 1.确定系统需求:首先要确定系统的具体需求和功能,包括用户界面、权限设置和管理、角色管理、资源管理等方面。同时需要明确系统的主要目标是什么,以便在设计时保持一致性。 2.确定角色:根据系统需求,确定所需要的角色类型和数量,包括系统管理员、普通用户等。在设计时应该合理分配权限,避免角色间权限重叠或漏洞。 3.确定资源:确定系统中的资源,包括数据、程序、文档等,依据资源的重要性和保密性进行分类,在角色分配时考虑资源所属角色的权限。 4.权限授予:根据角色的不同,授予对应的资源访问权限,包括读取、修改、删除等。在授予权限时要严格按照角色的权限定义进行操作,避免数据泄漏和滥用。 5.权限审核:对所有权限的修改和删除操作进行记录和审查,定期对权限进行审核,保证系统的安全性和稳定性。 6.权限维护:系统上线后,需要对权限进行维护和更新,包括新增角色、修改权限、删除角色等操作,同时定期对系统进行安全检查和修复漏洞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值