我的应用使用基于角色的访问控制并检查它使用按位操作的权限。伪代码类似于:
function HasPermission(userPermission, permissionBitMask) {
return (userPermission& permissionBitMask) != 0;
}
现在,我决定切换到OAuth 2将使用JWT。根据OAuth 2的规范:
范围表示为区分大小写和空格分隔的一组 字符串。
但我想将范围指定为数字,而不是:
{
scope: ["item:create", "item:view", "product:view"]
// or an object based structure
}
我想用:
{
scope : 7
}
这个设计是否可以接受,如果我使用区分大小写的字符串,我会错过什么。我认为按位运算符方法应该比字符串比较和搜索更具性能。在后一种情况下将需要它。
答案 0 :(得分:1)
从JWT的角度来看,这种方法很好,因为声明值可以是任何JSON类型,因此数字很好。
对于JWT,声明名称是字符串,声明值可以是任何JSON类型。
但是,如果您要求遵守OAuth2,则您的提案将无法接受。如果您想从自己的授权服务器开始,但希望保持打开选项并轻松切换到由您托管的第三方授权服务器或像Auth0这样的云身份验证提供程序,那么保持合规可能会有所帮助。 (披露:我在Auth0工作)
如果我是你,即使我没有切换实施的计划,我也会遵守OAuth2标准。应该很容易实现从多个string
值到用于表示权限的整数的转换。在一般情况下,这种简单的转换永远不会成为应用程序的性能瓶颈,但如果您确实有非常具体的性能要求,那么您始终可以将整数作为string
包含在JWT中:
{ scope: "7" }
这样您就可以使用OAuth2,只需使用简单的解析操作即可转换为可用于按位比较的值。