Design patterns 设计网站权限方案的资源

Design patterns 设计网站权限方案的资源,design-patterns,web-applications,permissions,Design Patterns,Web Applications,Permissions,我正在开发一个需要访问许可计划的网站。我不确定我想如何构建该计划,而且我很难找到好的资源,不仅要确定如何实施许可计划,还要确定如何规划该计划应该能够做什么 我有很多问题,但没有很多可靠的信息。我也无法解释现有答案的利弊 它是否应该基于角色以及用户是否具有角色 它应该是基于组的吗? 小组是否应该成为小组的成员,如在AD中 还是只有用户才能成为组的成员 我应该如何处理权限默认值? 是否应根据创建页面的工具设置页面 创建用户是否应设置页面创建权限 用户应该能够创建自己的组吗 您在设计许可方

我正在开发一个需要访问许可计划的网站。我不确定我想如何构建该计划,而且我很难找到好的资源,不仅要确定如何实施许可计划,还要确定如何规划该计划应该能够做什么

我有很多问题,但没有很多可靠的信息。我也无法解释现有答案的利弊

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

您在设计许可方案方面有何经验?我对这方面非常了解,任何好的资源、书籍、博客等都会非常有帮助。

我对公司许可系统的灵活性和威力印象深刻

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

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

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

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


某种程度上解决了这个问题,尽管它没有那么强大。CMS中的每个用户都可以使用组权限(仅限)、使用个人权限扩展组权限或使用个人权限(仅限)。

这些想法可能对您有好处,也可能对您没有好处,但我从头开始构建了一个基于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”被替换为有意义的名称。。显然

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