webapi 基于bitmask的

本文介绍了一种使用bitmask实现Web API权限控制的方法。通过数据库设置权限ID为2的幂次形式,并利用枚举类型和位操作符进行权限验证。这种方法适用于权限较少的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要讨论web api实现基于bitmask的认证; 这里说的是有没有权利访问一个web method

这个应该可以实现,代码片段来自网络


这个方法适用于权限不多的情况,如果太多了需要改良


1. DB: id 是按照bit来设置的而不是连续数字序列。 1,2,4,8, 16,32.....

RolePermissionIdName
11ViewDocument
12ViewSearch
14ViewDetail

存储过程: 对于特定的role=1, 返回id的总数sum; 也就是说返回值=7



2. Application

设置一个enum对应数据库中的表

[Flags]
public enum Permissions
{
    ViewDocument= 1,
    ViewSearch= 2,
    ViewDetail= 4
}

当存储过程获得数值后存储在memory 或者cache中, 自己写一个AuthorizeAttribute的拓展

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public PermissionsPermission{ get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);            
        if (!isAuthorized)
            return false;

        string username = httpContext.User.Identity.Name;

        UserRepository repo = new UserRepository();

        return repo.IsUserInR(username, this.Permission);
    }
}
在api中写

[CustomAuthorize(Permission = Permission.ViewSearch)]
        public HttpResponseMessage LoadSearch(){};


在IsUserInR是真正检查的地方

小窍门,如下代码可以根据总数返回符合要求的bitmask列表


var mask = (Permissions)7;

var result =
    Enum.GetValues(typeof(Permissions))
        .Cast<Permissions>()
        .Where(value => mask.HasFlag(value))
        .ToList();
或者直接用位运算的 或 来判断是不是可以





[Flags]
public enum Permissions
{
    ViewDocument= 1,
    ViewSearch= 2,
    ViewDetail= 4
}

### UE4 中的 Bitmask 使用与实现 #### 什么是 Bitmask? 在 Unreal Engine 4 (UE4) 中,位掩码(Bitmask)是一种用于高效管理和操作一组布尔标志的技术。通过将多个标志存储在一个整数中,可以显著减少内存占用并提高处理速度。 #### 如何声明和使用 Bitmask 属性 属性现在可以被声明为位掩码,并可以选择关联枚举来封装位标志值[^1]。这种特性不仅适用于 C++ 编程,也支持蓝图脚本系统的使用: ```cpp UENUM() enum class EMyFlags : uint8 { None UMETA(Hidden), FlagOne = 0x1, FlagTwo = 0x2, FlagThree= 0x4, }; UPROPERTY(EditAnywhere, BlueprintReadWrite) TEnumAsByte<EMyFlags> MyFlag; ``` 上述代码展示了如何定义一个带有三个可能状态的位标记集合 `EMyFlags` 并将其应用于类成员变量 `MyFlag` 上。 #### 基础位运算示例 为了更好地理解位掩码的操作方式,在下面的例子中定义了一些常量 BIT_0 到 BIT_7 来代表不同的二进制位置;初始化了一个名为 `bitmask` 的位掩码变量设为零;接着利用按位或运算符设置了特定的位置;最后借助于按位与运算符检测某一位是否已被激活[^2]: ```cpp const int32 BIT_0 = 1 << 0; // Binary: 00000001 const int32 BIT_1 = 1 << 1; // Binary: 00000010 // ... up to ... const int32 BIT_7 = 1 << 7; // Binary: 10000000 int32 bitmask = 0; // Set specific bits using bitwise OR operator bitmask |= BIT_0 | BIT_2; // Check if a particular bit is set using bitwise AND operator bool IsBitSet(int32 mask, int32 flag){ return ((mask & flag) != 0); } ``` 这段简单的例子说明了怎样创建以及查询位掩码内的单个旗标。 #### Vulkan 图像用途中的注意事项 当涉及到图形 API 如 Vulkan 时,如果图像用途包含了 `VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT` ,那么除了颜色附件、深度模板附件及输入附件之外其他任何位都不能被设置[^3]。这表明对于临时附加使用的纹理资源来说,其允许的功能范围受到了严格限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值