我正在我的应用程序中建立授权,并具有三个角色:
用Rails表示这一点的最好方法是什么?我曾考虑过将以下布尔字段添加到用户表中:
然后is_user?
在User模型中创建等等函数。
一个用户可以有多个角色(可以是全部三个)。
我建议对访问级别使用按位值。这是有效的,因为您的角色数量有限,并且您的用户可以一次拥有多个角色。
它比使用外部gem更快,更容易维护。
想法是为每个访问级别使用一个数字值,该数字值可以在位级别进行累加。
Level | Int val | Bit val
user | 1 | 00000001
moderator | 2 | 00000010
admin | 4 | 00000100
another | 8 | 00001000
etc ... | 16 | 00010000
因此,用户和主持人的访问级别将为1 + 2 = 3(位00000011)。然后,我们可以测试位值以定义用户access_level
1)access_level
在您的用户模型中添加一列,类型为整数,默认为0
2)设置常量以定义您的访问级别值
class User < ActiveRecord::Base
USER = 1
MODERATOR = 2
ADMIN = 4
end
3)创建add_access_level
和remove_access_level
方法
class User < ActiveRecord::Base
# Add the desired bit
def add_access_level(level)
self.access_level |= level
end
# Removed the desired bit
def remove_access_level(level)
self.access_level &= ~level
end
end
注意:由您决定将这些更改持久保存在数据库中
4)创建is_user?
,is_moderator?
和is_admin?
方法
class User < ActiveRecord::Base
def is_user?
is_access_level? USER
end
def is_moderator?
is_access_level? MODERATOR
end
def is_admin?
is_access_level? ADMIN
end
private
def is_access_level?(level)
self.access_level & level == level
end
end
注意:我会使用method_missing
,但这不在我们的讨论范围内。
5)测试
u = User.new
u.is_admin?
=> false
u.is_moderator?
=> false
u.is_user?
=> false
u.add_access_level User::USER
u.add_access_level User::MODERATOR
u.is_admin?
=> false
u.is_moderator?
=> true
u.is_user?
=> true
u.remove_access_level User::MODERATOR
u.is_admin?
=> false
u.is_moderator?
=> false
u.is_user?
=> true
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句