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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值