2009-12-02 16 views
3

我正在开发一个需要访问权限方案的网站。我不确定我想如何构建这个方案,而且我很难找到很好的资源来决定如何实施许可方案,但是如何规划这个方案应该能够做什么。设计网站权限方案的资源

我有很多问题,没有很多可靠的信息。我无法制定可用答案的优缺点。

  • 它应该是基于角色还是用户有角色?
  • 它应该是基于组?
    • 组应该能够成为组的成员,就像在AD中一样?
    • 或者应该只有用户能够成为组的成员?
  • 我该如何处理权限默认值?
    • 应该根据创建页面的工具进行设置吗?
    • 创建用户是否应该在页面创建时设置权限?
  • 用户是否应该能够创建自己的组?

您在设计权限方案时有什么经验?我非常青睐这个,任何优秀的资源,书籍,博客等都会非常有帮助。

回答

0

我对KnowledgeTree的许可制度的灵活性和权力印象深刻。

它的大致安排如下:业务部门 - >组(和子组) - >角色 - >用户

KT是一个文档管理系统,但所有的权限在目录级指定的,而不是资产本身。每个资产和子目录都从其父级继承权限。

这使您可以在组的基础上设置相当广泛的权限,并通过对角色设置更明确的权限来真正缩小权限。用户随后根据需要分配到角色;用户A可能被分配到目录X的编辑器角色,但不会分配给Y.这些权限将覆盖用户A已经在的任何组的顶层。

我的一个抱怨是,没有真正的方法来定义特定的权限一个用户直接。如果我希望用户B对所有目录具有一定的访问权限,那么我必须将它们添加到一个组中或将它们分配给一个角色(这又必须创建或分配给目录)。

TYPOlight webCMS一种纠正这个问题,虽然它几乎不健壮。 CMS中的每个用户可以使用他们的组权限(仅限),使用个人权限扩展组权限,或使用个人权限(仅限)。

1

这些想法可能会或可能不会有任何对你有好处,但我建立了一个基于网络的,允许驱动系统,从头开始(我需要低级别控制,与其他系统集成),像这样:

  • 用户或组可以具有的权限
  • 用户的有效权限集是超集的所有允许和丹尼斯为用户和该用户是
  • 丹尼斯倍率的成员的组允许
  • 用户级别的权限覆盖任何组设置(允许您公关iviledge管理员,主管等)
  • 用户的有效权限集存储在会话登录时,然后权限通过权限管理器(使用逐OPS)测试
  • 每个许可范围都有它自己的位掩码,这些存储在数据库中,允许您自动生成权限实用程序类作为构建过程的一部分。实用类看起来像这样:

    public static class Area1 
    { 
        public static int AreaId { get { return 1; } } 
        public static int Permission1 { get { return 1; } } 
        public static int Permission2 { get { return 2; } } 
        public static int Permission3 { get { return 4; } } 
    } 
    public static class Area2 
    { 
        public static int AreaId { get { return 2; } } 
        public static int Permission1 { get { return 1; } } 
        public static int Permission2 { get { return 2; } } 
        public static int Permission3 { get { return 4; } } 
        public static int Permission4 { get { return 8; } } 
        public static int Permission5 { get { return 16; } } 
    } 
    

    等等

  • 然后你就可以定义权限基页:

    public class PermissionsPage: BasePage 
    { 
        int _permissionAreaId; 
        int _permissionValue; 
        string _page; 
    
    public PermissionsPage(int permissionAreaId, int permissionValue) 
        : base() 
    { 
        Init += new EventHandler(PermissionsPage_Init); 
        _permissionTypeId = permissionTypeId; 
        _permissionValue = permissionValue; 
    } 
    
    void PermissionsPage_Init(object sender, EventArgs e) 
    { 
        if (!IsPostBack) 
        { 
         _page = Request.Url.Segments.Last(); 
         if (!PermissionsManager.TestPermission(UserWebSession.User, _permissionTypeId, _permissionValue)) 
         { 
          // handle permission denied 
         } 
         else 
         { 
          // log page access 
         } 
        } 
    } 
    

    }

  • 实用程序文件,然后允许你在开发过程中要做这样的事情:

    public partial class yourControlledPage : PermissionsPage 
    { 
        // test permission over an entire page 
        public yourControlledPage() 
         : base(PermissionDef.Area1.AreaId, PermissionDef.Area1.Permission1) 
        { 
        } 
    } 
    
  • // test permission over a specific control 
    yourDropDownList.Enabled = PermissionsManager.TestPermission(UserWebSession.User, PermissionDef.Area2.AreaId, PermissionDef.Area2.Permission4); 
    

*如果 '区域1' 和 '的外国人,' 例如用有意义的名称进行替换。显然!

然后再次,可能有第三方库,你可以很好地插入,并做你需要的一切......