设计网站许可方案的资源

时间:2009-12-02 20:44:03

标签: design-patterns web-applications permissions

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

我有很多问题而不是很多可靠的信息。我无法阐述可用答案的利弊。

  • 它应该是基于角色的吗?如果用户有角色吗?
  • 它应该是基于群组的吗?
    • 群组是否可以成为群组的成员,如AD?
    • 或者只有用户才能成为群组成员?
  • 我应该如何处理权限默认值?
    • 是否应根据创建页面的工具进行设置?
    • 创建用户是否应该设置页面创建权限?
  • 用户是否应该能够创建自己的群组?

您在设计权限计划方面有什么经验?我在这里非常环保,任何好的资源,书籍,博客等都会非常有用。

2 个答案:

答案 0 :(得分:1)

这些想法可能对您有益,也可能没有任何好处,但我从头开始构建基于Web的权限驱动系统(我需要低级控制以与其他系统集成),如下所示:

  • 用户或群组可能拥有权限
  • 用户的有效权限集是用户和用户所属组的所有允许和拒绝的超集
  • 拒绝覆盖允许
  • 用户级权限会覆盖任何组设置(允许您对管理员,主管等进行权限管理)
  • 用户的有效权限集在登录时存储在会话中,然后通过权限管理器测试权限(使用按位操作)
  • 每个权限区域都有自己的位掩码,这些位掩码存储在数据库中,允许您在构建过程中自动生成权限实用程序类。实用程序类看起来像这样:

    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);
    

*例如,'Area1'和'Permission1'被替换为有意义的名称..显然!

然后,很可能会有第三方图书馆,你可以很好地插入,并做你需要的所有......

答案 1 :(得分:0)

我对KnowledgeTree的权限系统的灵活性和强大能力印象深刻。

大致如下组织:业务单位 - >组(和子组) - >角色 - >用户

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

这允许您在组的基础上设置相当广泛的权限,并通过为角色设置更明确的权限来缩小范围。然后根据需要为用户分配角色;用户A可能被分配给目录X的编辑者角色但不分配给Y.这些权限将分配给用户A已经在的任何组。

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

TYPOlight webCMS有点纠正了这个问题,虽然它不是那么强大。 CMS中的每个用户都可以使用其组权限(仅限),使用单独的权限扩展其组权限,或使用单独的权限(仅限)。