任何组织都具有树状结构,例如: 

集团公司 

   --**省分公司

     --销售部

       --销售总监

       --业务员

     --财务部

       --财务总监

       --会计

       --出纳

     --生产部

       --车间主任

  --**省分公司

     --销售部

       --销售总监

       --业务员

     --财务部

       --财务总监

       --会计

       --出纳

     --生产部

       --车间主任

对于这样的组织机构中创建的资源如何进行权限管理呢?Crystalwall设计了FilePermissionInfo类来处理这个问题。

Crystalwall中,认为所有的资源都是“文件”,每一个文件都具有一个路径,所有的资源都必须在根目录“/"之下。例如一个可执行文件:/xyz/mn/p.exe它在/xyz/mn目录之下,/xyz/mn/p.exe为文件的路径。

Crystalwall使用匹配的方式来匹配文件的路径,在crystalwall中可以使用通配符"?"表示匹配任意单个字符,“*”表示匹配任意多个字符,"**"表示匹配任意的目录,例如,/xyz/**/*.exe匹配/xyz/mn/p.exe,也匹配/xyz/mn/pqr/p.exe但不匹配/xyz/xx/m.txt

同时,在FilePermissionInfo中还具有动作的概念,FilePermissionInfo中的动作分为4种:创建、读取、写入、运行。分别使用字符串"crwx"表示,这4位的字符串每一个位都表示是否具有此动作权限,如果不具有,则使用"-"表示,例如:"c-w-"表示具有创建和写入权限,但不具有读取和运行权限。

使用了”路径“和动作两个概念,FilePermissionInfo能够很好的解决组织机构树中资源权限的问题:

如果某个用户具有权限:FilePermissionInfo,其路径为"/xyz/**/*.exe",动作为”crwx"则当访问组织机构树种某个节点中的某个资源时,例如:

Xyz

  --mn

--pq

   --tt.exe

   --aa.txt

的tt.exe资源时,crystalwall则判断当前用户的FilePermissionInfo是否匹配路径/xyz/mn/pq/tt.exe,然后在根据应用本身的业务规则判断施加在tt.exe上的动作,如果具有此权限,则允许执行,否则抛出权限异常。

上例中,很显然/xyz/**/*.exe是匹配/xyz/mn/pq/tt.exe的,但不匹配/xyz/mn/pq/tt.txt,因此,当前用户能够对/xyz/mn/pq/tt.exe资源进行相关操作,而/xyz/mn/pq/tt.txt则不允许!

Last edited Nov 17, 2010 at 7:23 AM by vincent_valenlee, version 1

Comments

vincent_valenlee Nov 17, 2010 at 7:55 AM 
对某个组织内创建的资源,例如A、B、C,如果用户具有ab访问权,但不具有c访问权,crystalwall可以进行控制,但是这里出现一个问题,如果ABC资源是从持久存储中动态查询出的资源,crystalwall如何控制?

如果crystalwall将所有数据查询后再过滤,则必然出现分页时每页数据不一致问题,例如总共100条资源,每页10条,但第一页有3条没有权限查看,第二页有5条没有权限查看,这样势必第一页将显示7条资源,第二页将显示5条资源。

关于这个问题,crystalwall认为没有通用的解决方案!crystalwall建议如果持久存储为数据库,例如SQL Server 2005,则可以使用C#编写一个数据库函数:
match_resource("当前用户名","路径字段"),这个函数在数据库中查找用户的权限表,找出FilePermissionInfo,然后匹配资源的路径字段,如果匹配则返回1否则返回0,然后sql语句可以这样编写:
"select * from resoure_table where match_resource(" + 用户名 + ", path) = 1";
通过这样的方式,从持久存储中查询出的数据都是符合权限的资源了