如何为 rails 中的每个用户分配特定角色?
How do I assign specific roles to each user in rails?
假设有 2 个角色 - 可以管理所有内容的管理员,以及已注册的用户,需要管理员批准他们可以在每个控制器上执行的特定 CRUD 操作。
就像 X 只能创建和读取文章,而 Y 可以执行更新和删除操作。
我还如何让管理员从网站本身为用户分配这些特定角色?
你应该检查 rolify gem: https://github.com/RolifyCommunity/rolify
但是如果您只需要 2 个角色(用户和管理员),您可以向用户 table 添加新列 :admin, :boolean, default: false
,然后您可以签入您的控制器,您可以编写 before_filter
检查 if @current_user.admin
如果没有,它会重定向或做其他事情。
在您的视图中,您可以隐藏更新和删除按钮unless @current_user.admin
这个怎么样Gemhttps://github.com/stffn/declarative_authorization/?
你可以把它做得非常颗粒化。定义角色,然后您可以相应地分配您的 CURD。它还有一个非常好的辅助方法,您可以使用它们来确定哪个角色在视图或控制器上执行什么任务。
假设基于
- 用户通过 AccessList 拥有多个角色
- 角色通过AccessList有很多用户
- 访问列表属于角色
- AccessList 属于用户
这是一张简图(我假设您会处理模型)
这是我为 DRY 一些常见任务制作的模块。
NOTE: Declarative Authorization 有一堆帮手,下面只是恭维他们,有些功能可能是多余的,可以重构并写得更好。它只是一个夜间构建的 :)
module AuthenticationRelated
def what_are_current_user_roles
objArray = []
current_user.roles.each do |role|
objArray.push role.name
end
return objArray
end
def does_user_have_this_role?(role_name)
result = false
obj_array = what_are_current_user_roles
obj_array.each do |a_role|
if a_role == role_name
result = true
end
end
result
end
def is_admin?
athu = false
if signed_in?
current_user.roles.each do |role|
if role.name == 'admin'
athu = true
end
end
end
return athu
end
# class_instance MUST be a parent class
# If you need to Authenticate
def user_allowed_create_and_edit?(class_model, class_instance)
user_is_allowed = false
if permitted_to? :create, class_model.new and has_user_own_this(class_instance)
user_is_allowed = true
else
user_is_allowed = false
end
# Override everything if user is admin
if is_admin?
user_is_allowed = true
end
return user_is_allowed
end
# Authentication for Builder
# relation has to be set to access_list
def has_user_own_this(model)
user_who_owns_this = model.access_list.user_id
if current_user.id == user_who_owns_this
return true
else
return false
end
end
def find_current_user_acls
acl = []
acls = AccessList.joins(:user).where("users.id = ?",current_user.id)
acls.each do |an_acl|
acl.push an_acl.id
end
acl
end
end
假设有 2 个角色 - 可以管理所有内容的管理员,以及已注册的用户,需要管理员批准他们可以在每个控制器上执行的特定 CRUD 操作。 就像 X 只能创建和读取文章,而 Y 可以执行更新和删除操作。 我还如何让管理员从网站本身为用户分配这些特定角色?
你应该检查 rolify gem: https://github.com/RolifyCommunity/rolify
但是如果您只需要 2 个角色(用户和管理员),您可以向用户 table 添加新列 :admin, :boolean, default: false
,然后您可以签入您的控制器,您可以编写 before_filter
检查 if @current_user.admin
如果没有,它会重定向或做其他事情。
在您的视图中,您可以隐藏更新和删除按钮unless @current_user.admin
这个怎么样Gemhttps://github.com/stffn/declarative_authorization/?
你可以把它做得非常颗粒化。定义角色,然后您可以相应地分配您的 CURD。它还有一个非常好的辅助方法,您可以使用它们来确定哪个角色在视图或控制器上执行什么任务。
假设基于
- 用户通过 AccessList 拥有多个角色
- 角色通过AccessList有很多用户
- 访问列表属于角色
- AccessList 属于用户
这是一张简图(我假设您会处理模型)
这是我为 DRY 一些常见任务制作的模块。
NOTE: Declarative Authorization 有一堆帮手,下面只是恭维他们,有些功能可能是多余的,可以重构并写得更好。它只是一个夜间构建的 :)
module AuthenticationRelated
def what_are_current_user_roles
objArray = []
current_user.roles.each do |role|
objArray.push role.name
end
return objArray
end
def does_user_have_this_role?(role_name)
result = false
obj_array = what_are_current_user_roles
obj_array.each do |a_role|
if a_role == role_name
result = true
end
end
result
end
def is_admin?
athu = false
if signed_in?
current_user.roles.each do |role|
if role.name == 'admin'
athu = true
end
end
end
return athu
end
# class_instance MUST be a parent class
# If you need to Authenticate
def user_allowed_create_and_edit?(class_model, class_instance)
user_is_allowed = false
if permitted_to? :create, class_model.new and has_user_own_this(class_instance)
user_is_allowed = true
else
user_is_allowed = false
end
# Override everything if user is admin
if is_admin?
user_is_allowed = true
end
return user_is_allowed
end
# Authentication for Builder
# relation has to be set to access_list
def has_user_own_this(model)
user_who_owns_this = model.access_list.user_id
if current_user.id == user_who_owns_this
return true
else
return false
end
end
def find_current_user_acls
acl = []
acls = AccessList.joins(:user).where("users.id = ?",current_user.id)
acls.each do |an_acl|
acl.push an_acl.id
end
acl
end
end