zoukankan      html  css  js  c++  java
  • 功能权限设计

    1.概述

        功能权限,限定了某一类用户(按角色)对资源的访问(CRUD)。一般常见的关系为Resource(如Menu,File等),Role,User,Privilege。其中,Privilege用于存储Role和Resource之间的关系。

    2.数据表设计

    IF OBJECT_ID ('dbo.Privileges') IS NOT NULL
        DROP TABLE dbo.Privileges
    GO
    
    CREATE TABLE dbo.Privileges
        (
        ID         INT IDENTITY NOT NULL,   --主键
        ResourceID INT NOT NULL,   --资源ID
        RoleName   NVARCHAR (50) NOT NULL,  --角色名称
        Flag       INT NOT NULL,  --权限标记
        CONSTRAINT PK_Privileges PRIMARY KEY (ID)
        )
    GO

    3.数据结构

    3.1 权限常量枚举

    [Flags]
    public enum EPrivilege
    {
        Retrieve = 1 << 0,
        Create = 1 << 1,
        Update = 1 << 2,
        Delete = 1 << 3,
        None = 1 << 4
    }

    3.2 功能权限

    /// <summary>
    /// 功能权限实体
    /// </summary>
    public partial class Privilege
    {
        /// <summary>
        /// 主键
        /// </summary>
        public long ID { get; set; }
    
        /// <summary>
        /// 角色名称
        /// </summary>
        public string RoleName { get; set; }
        /// <summary>
        /// 功能菜单ID
        /// </summary>
        public string FunctionMenuID { get; set; }
    
        /// <summary>
        /// 权限位标记
        /// </summary>
        public int Flag { get; set; }
    }
    
    public partial class Privilege
    {
        /// <summary>
        /// 将Flag与EPrivilege等效转化
        /// </summary>
        public EPrivilege FlagEqualToEPrivilege
        {
            get
            {
                var str = this.Flag.ToString();
                return (EPrivilege)Enum.Parse(typeof(EPrivilege), str, true);
            }
            set
            {
                this.Flag = (int)value;
            }
        }
    
        public bool HasPrivilege(EPrivilege privilege)
        {
            return (this.FlagEqualToEPrivilege & privilege) != 0;
        }
    
    }

    3.3 DB Methods

    public class PrivilgeExtensions
    {
        public static bool HasPrivilege(this IPrincipal user, string resourceName, EPrivilege privilegeType)
        {
            //......
            return false;
        }
    }

    总结:Flag与Enum之间的自动解析应该是通过【Flags】标记完成。

  • 相关阅读:
    域名和dns
    Oracle版本区别及版本选择!
    并发
    URL和URI的区别??
    sshpass免密码(免交互)连接
    python之路 目录
    awk sed 总结
    aiohttp使用
    Mac破解软件 “XXX”意外退出 奔溃解决方法
    我的Mac中毒了,病毒居然叫做MacPerformance
  • 原文地址:https://www.cnblogs.com/pengzhen/p/3788175.html
Copyright © 2011-2022 走看看