DTcms 采用二进制权限管理

Hailin 发表于 2017-06-30 09:54:23 来源于CMS插件网 评论 0 点击 1004
摘要:DTcms自带的权限系统虽然强大,但是已经不能满足我们的需求,尤其是做网络公司;所以才有了小编写的二进制授权,最大支持64种不同权限操作。

DTcms自带的权限系统虽然勉强够用,但是已经不能满足我们的需求,尤其是做网络公司;所以小编闲暇之余将DTCms权限改为采用二进制授权,最大支持64种不同权限操作,即2的64次方(9223372036854775808),如下图:

QQ截图20170630092848.png

先说说我的做法的主要思路:

每一个操作的权限值,用一个二进制数来表示,每个权限值,只能是(1),(10),(100),(1000),也就是说,是2的N次方;因此,只要对指定的一位进行判断是0还是1,就可以验证用户的权限了。

这样我们只大大减少了跟数据库请求的次次,我们也可以很好的控制操作界面相关功能,如:二进制10000属于添加功能,那么我们只需要用账号所拥有的权限跟二级数10000执行与操作,如果大于0就说明有操作权限,如果等于0表示没有操作权限;如下图

未标题-1.jpg

目前二进制权限,以及整站权限功控制基本完成,权限已精确到按钮,没有权限的功能,按钮都不会显示,预计7月中旬,同redis一起更新到内部群,所有赞助者都可以第一时间更新到自己的系统中;

以下是正式应用的效果图:

未标题-2.jpg

(权限数据)

未标题-1.jpg

我们可以从中看到30,表示拥有显示、查看、添加、编辑权限  换算成二进制是“11110”,想比传统的是不是好了很多!

未标题-1.jpg

/// <summary>
/// 验证是否拥有权限
/// </summary>
/// <param name="r"></param>
/// <param name="em"></param>
/// <returns></returns>
public static bool Verified(Int64 r, string em)
{
    //验证是否拥有所有权限
    if ((r & 1) > 0)
    {
        return true;
    }
    //其它
    ActionItem item;
    if (dict.TryGetValue(em, out item))
    {
        if ((r & item.uid) > 0)
        {
            return true;
        };
    }
    return false;
}


针对DTcms4.0.3功能修复和优化统计

热门资讯