美文网首页权限设计
权限系统_数据权限控制

权限系统_数据权限控制

作者: 高山之水 | 来源:发表于2017-10-30 17:52 被阅读0次

    1、使用 query filter

    先举例说明一下数据权限,假设一个工作任务应用有以下的需求:

    普通员工可以查看自己的工作项
    部门经理可以查看自己管理部门的所有工作项
    对于普通员工和部门经理,他们访问应用的入口都是相同的,应用需要根据不同的角色返回不一样的数据结果,这就是数据权限控制。

    数据权限是个比较复杂的问题,规则非常灵活,在Leap中并没有内置实现,但提供了一个基础机制,可以相对简单的实现数据权限。

    1.1 查询过滤器(Query Filter)

    查询过滤器是 ORM 模块中的功能,默认是关闭的,开启后所有的查询语句都会在 where 语句的最后自动加上类似 @filter(User) 的表达式。

    假设执行查询语句:

    select * from user u where u.name = :name
    那么开启 Query Filter 后将会自动变为:

    select * from user u where ( u.name = :name ){? and ( @filter(User) )}
    关于查询过滤器的细节在这里不展开细说,下面具体说明如何使用查询过滤器实现数据权限。

    1.2 基于 Query Filter 实现数据权限

    1.3 开启

    修改 src/main/resources/conf/config.xml ,增加以下配置属性:

    <properties prefix="orm">
    <property name="query_filter.enabled" value="true"/>
    </properties>
    1.4 实现

    编写类 SecurityQueryFilter.java :

    package hello.beans;
    import leap.lang.params.Params;
    import leap.orm.sql.Sql;
    import leap.orm.sql.SqlContext;
    import leap.orm.sql.SqlTag;
    import leap.orm.sql.SqlTagProcessor;
    public class SecurityQueryFilter implements SqlTagProcessor {

    @Override
    public String processTag(SqlContext context, Sql sql, SqlTag tag, Params params) {
        String entityName = tag.getContent();
        if(entityName.equals("User")) {
            return "t.id = #{env.user.id}";
        }
        return null;
    }
    

    }
    返回的表达式语法请看数据访问章节,其中别名 t. 是固定写法,在执行中会被替换为真正的别名。

    配置 bean 生效:

    <bean name="filter" type="leap.orm.sql.SqlTagProcessor" class="hello.beans.SecurityQueryFilter"/>

    2.使用sqlMAP进行sql拼接
    其原理也是sql拼接 不写了

    参考地址:http://leapframework.org/doc/security/op_perm.html

    相关文章

      网友评论

        本文标题:权限系统_数据权限控制

        本文链接:https://www.haomeiwen.com/subject/yolmpxtx.html