假设有两个角色 - 管理员可以管理所有内容,以及已注册的用户,并且需要管理员批准他们可以在每个控制器上执行的特定CRUD操作。 像X一样,只能创建和阅读文章,而Y可以执行更新和删除操作。 如何让管理员从网站本身为用户分配这些特定角色?
答案 0 :(得分:0)
你应该检查rolify gem:https://github.com/RolifyCommunity/rolify
但是如果您只想要2个角色(用户和管理员),则可以向用户表:admin, :boolean, default: false
添加新列,然后您可以签入控制器,您可以编写before_filter
来检查{{1}如果没有,它会重定向或者使用其他内容。
在您的视图中,您可以隐藏用于更新和删除if @current_user.admin
答案 1 :(得分:0)
这个宝石https://github.com/stffn/declarative_authorization/怎么样?
你可以让它非常颗粒化。定义角色,然后您可以相应地分配CURD。此外,它还有一个非常好的Helper方法,您可以使用它们来确定哪个角色在View或Controller上执行哪个任务。
假设基于
这是一个快速的数据库(我假设您将负责模型)
这是我为干一些常见任务而制作的模块。
注意: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