所以我使用STI将一些角色合并到我的用户表中。现在我只有普通的用户和管理员。我已经安装了Rails_admin,我需要一种方法来验证管理员,但我不知道如何安全地进行操作。
现在我的应用程序控制器中有这段代码
def authenticate_admin!(opts={})
current_admin || redirect_to(?)
end
def current_admin
current_user if current_user.is_a? Admin
end
在我的rails_admin.rb文件中,我有这个
config.authenticate_with do
authenticate_admin!
end
我目前的问题是我无法让redirect_to实际指向任何东西。我一直在收到错误。如果用户不是我需要的管理员,也是一个简单的重定向?这是最佳实践,最安全吗?我在这里朝着正确的方向前进吗?任何帮助,将不胜感激。感谢
答案 0 :(得分:1)
好的,有几件事:
1)CanCan非常易于使用,值得进行小型安装。这是一个例子,如果你有两个用户实例方法is_admin,app / models / ability.rb会是什么样子?和is_reviewer?
class Ability
include CanCan::Ability
def initialize(user)
if user && user.is_reviewer?
can :access, :rails_admin
can :dashboard
cannot :read, [Class1, Class2, Class3]
can :read, Class4
end
if user && user.is_admin?
can :access, :rails_admin
can :manage, :all
end
end
end
您的RailsAdmin配置包含以下内容:
RailsAdmin.config do |config|
config.authorize_with :cancan
...
end
不要忘记,您必须将cancan添加到您的Gemfile中才能作为依赖项安装。
2)接下来,可能更有价值的是,您不希望在authenticate方法中抛出重定向代码。相反,您可能希望将以下内容添加到ApplicationController:
rescue_from Acl9::AccessDenied do |exception|
respond_to do |format|
format.json do
render :json => { :success => false, :message => "You do not have access to do this action." }
end
format.html do
flash[:error] = 'You do not have access to view this page.'
redirect_to root_url
end
end
end
或者只是:
rescue_from Acl9::AccessDenied do |exception|
flash[:error] = 'You do not have access to view this page.'
redirect_to root_url
end