colin_xia 发表于 2011-12-29 22:52:37

分享实现系统数据权限管理的过程

最近用CI实现公司一个MIS的过程中,碰到一个数据权限管理问题。郁闷了好一阵。
最后追踪 金蝶 k3 的权限管理 sql。找到了解决办法。现在我把我的思路贴上来供大家参考。

问题描述:
    实现和ERP类似的对基础资料的查看,编辑,删除权限控制。 我用的 sql server 2005

(一)先贴上 k3 数据库跟踪的代码


-- 查询数据
select t1.FItemID,min(t1.FParentIDX) as FParentIDX
,(case when max(substring(t1.FdataAccessDelete,t0.FaccessUUID/8+1,1) & power(2,7-(t0.FaccessUUID+7)%8))>0 then 1 else 0 end) as FDeleteAccess
,(case when max(substring(t1.FDataAccessEdit,t0.FaccessUUID/8+1,1) & power(2,7-(t0.FaccessUUID+7)%8))>0 then 1 else 0 end ) as FEditAccess
,(case when max(substring(t1.FDataAccessView,t0.FaccessUUID/8+1,1) & power(2,7-(t0.FaccessUUID+7)%8))>0 then 1 else 0 end) as FViewAccess
from t_user t0 inner join Access_t_ICItem t1
on t0.FuserID=16417 --16417用户ID
group by t1.FItemID

-- 修改数据
Update Access_t_Organization Set FDataAccessView=
SubString(FDataAccessView,1,11)+Convert(binary(1),SubString(FDataAccessView,12,1) & 239)+SubString(FDataAccessView,13,88)
where FParentIDX=25263 or FItemID=25263



(二)原理测试sql


--select power( 2,7-(@id+7)%8 )                                        -- power( 2,7-(@id+7)%8 ) 数据存放在字节的哪一位       
--select substring( @accesssetting,@id/8+1,1 )        -- ( @id/8+1 ) 数据存放在哪个字节

declare @id as int                                                        set @id = 5
-- 假设用户的 id =5
declare @accesssetting as binary(200)                set @accesssetting = Convert(binary(200),0)
-- 假设基础资料存放权限的字段为200 字节(支持 200 * 8 为用户)
-- 且默认所有人都没有权限 (全 0 )

-- 查询用户的权限,值为 0 没有权限
select substring( @accesssetting,@id/8+1,1 ) & power(2,7-(@id+7)%8)

-- 修改用户 id 的权限
-- 通过 用户id 和 权限字段的位数计算出 用户权限存放字节的前后区间
declare @start_1 as int,@offset_1 as int,@start_2 as int, @offset_2 as int
select @start_1                = case when ( @id/8+1 ) > 1 then 1 else 0 end
select @offset_1        = case when ( @id/8+1 ) > 1 then ( @id/8+1 ) - 1 else 0 end
select @start_2                = case when ( @id/8+1 ) < 200 then ( @id/8+1 ) + 1 else 0 end
select @offset_2        = case when ( @id/8+1 ) < 200 then 200 - ( @id/8+1 ) else 0 end
-- select @start_1,@offset_1,@start_2,@offset_2

-- 授予用户权限(|位或操作符, power 求平方 )
select @accesssetting = SubString( @accesssetting,@start_1,@offset_1 )
        + Convert( binary(1),SubString(@accesssetting, @id/8+1 ,1) | power(2,7-(@id+7)%8))
        + SubString(@accesssetting,@start_2,@offset_2)

-- 可以看到,值为8 有权限
select substring( @accesssetting,@id/8+1,1 ) & power(2,7-(@id+7)%8)

-- 取消用户权限(~位非操作符 )
select @accesssetting = SubString( @accesssetting,@start_1,@offset_1 )
        + Convert( binary(1),SubString(@accesssetting, @id/8+1 ,1) & ( ~ power(2,7-(@id+7)%8) ) )
        + SubString(@accesssetting,@start_2,@offset_2)

-- 好咯,权限已取消
select substring( @accesssetting,@id/8+1,1 ) & power(2,7-(@id+7)%8)






页: [1]
查看完整版本: 分享实现系统数据权限管理的过程