hsweb-framework数据权限:行级权限与列级权限控制实现

hsweb-framework数据权限:行级权限与列级权限控制实现

【免费下载链接】hsweb-framework hsweb (haʊs wɛb) 是一个基于spring-boot 2.x开发 ,首个使用全响应式编程的企业级后台管理系统基础项目。 【免费下载链接】hsweb-framework 项目地址: https://gitcode.com/gh_mirrors/hs/hsweb-framework

在企业级应用开发中,数据权限控制是保障数据安全的核心环节。hsweb-framework作为基于Spring Boot 2.x的全响应式企业级后台管理系统基础项目,提供了灵活的数据权限解决方案,支持行级权限(控制哪些数据可见)和列级权限(控制哪些字段可见)的精细化管理。本文将从实际应用场景出发,详解hsweb-framework数据权限的实现机制与配置方法。

数据权限控制体系

hsweb-framework的数据权限控制基于RBAC(基于角色的访问控制)模型扩展,通过DataAccessConfigConvert接口和DataAccessHandler接口实现自定义权限规则。核心模块位于hsweb-authorization/,其中权限处理流程定义在hsweb-authorization-basic/,API规范详见hsweb-authorization-api/

权限控制流程包括三个关键步骤:

  1. 权限配置转换:将前端配置的权限规则转换为系统可执行的配置对象
  2. 权限规则匹配:判断当前请求是否匹配预设的权限规则
  3. 权限拦截处理:根据匹配结果拦截或放行请求

行级权限实现

行级权限控制用户可访问的数据范围,例如"部门经理只能查看本部门数据"。实现需两步:

1. 自定义配置转换器

实现DataAccessConfigConvert接口,将前端配置的JSON转换为权限配置对象:

@Component
public class MyDataAccessConfigConvert implements DataAccessConfigConvert {
    @Override
    public boolean isSupport(String type, String action, String config) {
        return "department_data".equals(type); // 匹配部门数据权限类型
    }

    @Override
    public DataAccessConfig convert(String type, String action, String config) {
        DepartmentDataConfig config = JSON.parseObject(config, DepartmentDataConfig.class);
        config.setAction(action);
        config.setType(type);
        return config;
    }
}

配置定义参考custom-data-access.md

2. 实现权限处理器

通过DataAccessHandler接口处理具体权限逻辑:

@Component
public class DepartmentDataAccessHandler implements DataAccessHandler {
    @Override
    public boolean isSupport(DataAccessConfig access) {
        return "department_data".equals(access.getType());
    }

    @Override
    public boolean handle(DataAccessConfig access, MethodInterceptorParamContext context) {
        DepartmentDataConfig config = (DepartmentDataConfig) access;
        Map<String, Object> params = context.getNamedArguments();
        
        // 获取当前用户部门ID
        String userDeptId = SecurityUtils.getCurrentUser().getDepartmentId();
        // 对比数据所属部门ID与用户部门ID
        return userDeptId.equals(params.get("deptId"));
    }
}

列级权限实现

列级权限控制数据字段的可见性,例如"普通用户隐藏手机号字段"。实现需结合数据脱敏和字段过滤:

1. 字段权限注解

使用@ColumnPermission注解标记需要控制的字段:

public class User {
    private String id;
    private String name;
    
    @ColumnPermission(roles = {"ADMIN"}) // 仅管理员可见
    private String phone;
    
    // getters and setters
}

2. 响应数据过滤

通过AOP拦截Controller方法,过滤无权限字段:

@Component
@Aspect
public class ColumnPermissionAspect {
    @Around("execution(* org.hswebframework.web.controller..*(..))")
    public Object filterColumns(ProceedingJoinPoint point) throws Throwable {
        Object result = point.proceed();
        // 根据当前用户角色过滤响应数据中的敏感字段
        return ColumnPermissionUtils.filter(result, SecurityUtils.getCurrentUser().getRoles());
    }
}

权限执行流程

hsweb-framework权限控制采用拦截器模式,完整流程如下:

  1. 请求拦截:MethodInterceptor拦截Controller方法调用
  2. 权限解析:从SecurityContext获取用户权限配置
  3. 规则匹配:调用DataAccessHandler.isSupport()匹配权限处理器
  4. 权限校验:执行DataAccessHandler.handle()验证权限
  5. 数据过滤:通过列级权限处理器过滤敏感字段

核心流程可参考权限处理流程图:

权限处理流程图

实际应用场景

多维度权限组合

可同时配置行级和列级权限,例如:

  • 行级:只能查看本部门订单
  • 列级:普通员工隐藏订单金额字段

动态权限调整

通过管理界面配置权限规则,实时生效无需重启:

  1. 在系统管理界面配置数据权限规则
  2. 权限配置自动更新到DataAccessConfig
  3. 下次请求自动应用新权限规则

总结与最佳实践

hsweb-framework数据权限控制通过灵活的扩展机制,支持复杂的权限需求。最佳实践包括:

  1. 权限粒度设计:行级权限按业务维度划分(部门、区域等),列级权限按数据敏感度划分
  2. 性能优化:高频访问接口建议缓存权限配置,减少数据库查询
  3. 权限审计:重要操作记录权限校验日志,便于问题排查
  4. 默认拒绝:未匹配任何权限规则时,默认拒绝访问

完整实现可参考hsweb-system-authorization/模块,更多高级用法详见官方文档README.md

通过合理配置数据权限,可有效防止敏感数据泄露,满足企业级应用的安全需求。如需进一步定制,可扩展DataAccessConfigConvert和DataAccessHandler接口,实现更复杂的权限逻辑。

【免费下载链接】hsweb-framework hsweb (haʊs wɛb) 是一个基于spring-boot 2.x开发 ,首个使用全响应式编程的企业级后台管理系统基础项目。 【免费下载链接】hsweb-framework 项目地址: https://gitcode.com/gh_mirrors/hs/hsweb-framework

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值