Security OAuth 2具有十进制数的作用域以使用位掩码
我的应用程序使用基于角色的访问控制,并使用逐位操作检查权限。伪代码类似于:Security OAuth 2具有十进制数的作用域以使用位掩码,security,oauth,permissions,jwt,roles,Security,Oauth,Permissions,Jwt,Roles,我的应用程序使用基于角色的访问控制,并使用逐位操作检查权限。伪代码类似于: function HasPermission(userPermission, permissionBitMask) { return (userPermission& permissionBitMask) != 0; } 现在,我决定切换到OAuth2,因为它将使用JWT。根据OAuth 2的规范: 作用域表示为一组区分大小写且以空格分隔的 字符串 但我想将范围指定为一个数字,而不是: { sc
function HasPermission(userPermission, permissionBitMask) {
return (userPermission& permissionBitMask) != 0;
}
现在,我决定切换到OAuth2,因为它将使用JWT。根据OAuth 2的规范:
作用域表示为一组区分大小写且以空格分隔的
字符串
但我想将范围指定为一个数字,而不是:
{
scope: ["item:create", "item:view", "product:view"]
// or an object based structure
}
我想使用:
{
scope : 7
}
这种设计可以接受吗?如果改用区分大小写的字符串,我会错过什么呢。我认为位运算符方法应该比后一种情况下需要的字符串比较和搜索更有效。从JWT的角度来看,这种方法很好,因为声明值可以是任何JSON类型,所以数字也可以 对于JWTs,虽然声明名称是字符串,但声明值可以是任何JSON类型 (来源: 但是,如果您需要遵守OAuth2,则您的建议将不被接受。如果您希望从自己的授权服务器开始,但希望保持选项开放,并轻松切换到由您托管的第三方授权服务器或云验证服务器,则遵守可能会有所帮助r喜欢。(披露:我在Auth0工作) 如果我是你,即使我没有切换实现的计划,我也会遵守OAuth2。实现从多个
字符串值到用于表示权限的整数的转换应该很容易。在一般情况下,这种简单的转换永远不会成为应用程序的性能瓶颈但是,如果您确实有非常具体的性能要求,您可以始终将整数作为字符串包含在JWT中:
{ scope: "7" }
通过这种方式,您将符合OAuth2,并且只需使用简单的解析操作即可将其转换为可用于按位比较的值。如果使用integer作为字符串使其符合要求,则我不会有任何问题。顺便说一句,我将Auth0用于我的一个项目,但如果您提供web应用程序的内部安装,则无法使用它