zoukankan      html  css  js  c++  java
  • B/S页面 通用权限控制(2)

    恰逢公司网络故障, JIRA、SVN、ORACLE都无法连接上,那就继续上次的议题吧。

    实现原理深入:

    1. 目标:查看所有招标合同, select * from Documents
    2. 权限约束场景:

          A. 每个用户仅可查看本部门创建的合同: where CreatedOffice in ( CurrentUser.ChildrenOffices)

          B. 每个用户仅可查看自己创建的合同:    where CreatedBy=CurrentUser.UserId

          C.指定权限用户可以查看关联的合同:    (需要通过Alt+双击,定义所有的合同权限,否则默认为All可见)

                      where DocumentId in (select ResourceId in AclParty p where p.PartyId in

                                                ( CurrentUser.Offices, CurrentUser.UserId, CurrentUser.Roles, CurrentUser.Groups )  

                         ) OR DocumentId NOT IN (select ResourceId in AclParty p )

               查看此用户/部门/角色/工作组拥有的合同, 以及未作授权的合同可见。

          D. 上述权限的组合

                         where CreatedOffice in (CurrentUser.ChildrenOffices) and DocumentId in (Resource … in ….AclParty …of ….CurrentUser…)

    3.  实施约束:

            QueryInfo info = new QueryInfo(“Documents d”);

            //IList allDocs = Dao.FindList(info);

          仅需设置如下属性, 则上述约束的sql会自动注入到查询条件后。

          A. info.AclProperty=”d.CreatedOffice”;   (常量检测CreatedOffice)

          B. info.AclProperty=”d.CreatedBy”;        (常量检测CreatedBy)

          C. info.AclProperty=”d.Id”;

          D.  info.AclProperty=”d.Id,d.CreatedOffice”;

    扩展应用:

    1. 检测用户对某一资源的控制串:

          A. bool  hasPurview = CurrentUser.GetAclOperation(“ResourceId”,"OperationCode”);

          B. btn_Del_.Visible  = CurrentUser.GetAclOperation(“DocumentId001”,"Del”);

          C. 对于同一资源Id, 一次取出此用户对应的所有OperationCode。

    2.   验证用户对某一资源的操作

          QueryInfo info = new QueryInfo(“Delete from Documents d”);

          info.AddParam(“OfficeId”, CurrentUser.Office);

          info.AclProperty=“d.Id”;   ///等同于 info.Where.Add(“Id”,"DocumentId in (Resuource …in ….AclParty …of ….CurrentUser…)");

          Dao.ExecuteUpdate(info);

          上述操作即可完成: 删除所有  本人拥有权限的、且属于本部门的合同。

    强制数据权限:

    1.QueryInfo无需定义任何AclProperty

    2. 通过AOP,在Dao拦截所有QueryInfo

    3. 逐一检验QueryInfo的QueryObject, 与AclItem 中的所有Module=QueryObject 的项目比较, 如果        

               info.QueryObject in (AclItem.ResourceCode)  and  info.GetOperationCode() == AclItem.OperationCode,  

          则 info.AclProperty=AclItem.Policy;

    4. 自动激发AclProperty校验。

    总结:

       通过上述步骤, 对数据项进行人工控制、自动注入都是非常方便的。 其控制粒度就是对象的属性。 根据属性在  资源-授权组 的设定, 即可有效的进行数据权限  判断、控制、校验。

        但目前对  同一对象 多个属性 叠加 校验时, 叠加策略如何灵活定义(AND, OR) ??

       如: 查看  经过总经理审批的  AND  我创建的

              查看 经过总经理审批的    OR   我创建的

    AclProperty如何扩充足够的语义,以完成完整的Policy设定? 欢迎大家讨论!!

  • 相关阅读:
    单机RedHat6.5+JDK1.8+Hadoop2.7.3+Spark2.1.1+zookeeper3.4.6+kafka2.11+flume1.6环境搭建步骤
    kafka_2.11-0.8.2.1+java 生产消费程序demo示例
    Kafka使用log.retention.hours改变消息端的消息保存时间
    Apache Kafka监控之KafkaOffsetMonitor
    Apache Kafka监控之Kafka Web Console
    Kafka三款监控工具比较
    linux查看本机IP、gateway、dns
    kafka_2.11-0.8.2.1生产者producer的Java实现
    linux下杀死进程(kill)的N种方法
    Linux查看硬件配置命令
  • 原文地址:https://www.cnblogs.com/crabo/p/1825189.html
Copyright © 2011-2022 走看看