rails_admin with cancan not catching access denied exception for redirect
rails_admin with cancan not catching access denied exception for redirect
我正在使用 rails 5、rails_admin、devise 和 cancancan。
一切正常,但当访问被拒绝时,它会显示 'You are not authorized to access this page' 错误屏幕。
我想重定向到root_path,我一直在寻找,我只发现我必须在app/controllers/application_controller.rb中写这段代码:
class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_path, :alert => exception.message
end
end
我做到了,但是我在未授权时仍然在错误消息中。它不会重定向。
我认为其余代码一定没问题,因为它可以工作,但不会重定向到任何地方。
#config/initializers/rails_admin.rb
config.authorize_with :cancan
config.current_user_method(&:current_user)
.
#app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.admin
can :access, :rails_admin # only allow admin users to access Rails Admin
can :dashboard
can :manage, :all
else
can :read, :all # allow everyone to read everything
end
end
end
我看到问同样问题的人多了,但是个个都没有答案。我找到了一个有 3 个答案的答案,但我不理解公认的解决方案,因为它确实没有解释任何解决方案:
Cancan + Devise rescue_from not catching exception
看起来 ApplicationController
默认情况下实际上并不是 RailsAdmin::MainController
的父级。因此,当 RailsAdmin::MainController
抛出 CanCan::AccessDenied
异常时,它实际上从未触及 ApplicationController
,救援块也从未启动。
您可以在 rails_admin.rb
配置块中使用
显式声明 ApplicationController
作为 RailsAdmin::MainController
的父级
config.parent_controller = 'ApplicationController'
您也可以通过扩展 rails_admin 控制器来实现这一点。这是猴子修补,但如果您不想将父控制器设置为 ApplicationController
由于特殊原因,这可能很有用。
将以下内容添加到 config/initializers/rails_admin_cancan.rb
文件。
require 'rails_admin/main_controller'
module RailsAdmin
class MainController < RailsAdmin::ApplicationController
rescue_from CanCan::AccessDenied do |exception|
flash[:alert] = 'Access denied.'
redirect_to main_app.root_path
end
end
end
我正在使用 rails 5、rails_admin、devise 和 cancancan。
一切正常,但当访问被拒绝时,它会显示 'You are not authorized to access this page' 错误屏幕。
我想重定向到root_path,我一直在寻找,我只发现我必须在app/controllers/application_controller.rb中写这段代码:
class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_path, :alert => exception.message
end
end
我做到了,但是我在未授权时仍然在错误消息中。它不会重定向。
我认为其余代码一定没问题,因为它可以工作,但不会重定向到任何地方。
#config/initializers/rails_admin.rb
config.authorize_with :cancan
config.current_user_method(&:current_user)
.
#app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.admin
can :access, :rails_admin # only allow admin users to access Rails Admin
can :dashboard
can :manage, :all
else
can :read, :all # allow everyone to read everything
end
end
end
我看到问同样问题的人多了,但是个个都没有答案。我找到了一个有 3 个答案的答案,但我不理解公认的解决方案,因为它确实没有解释任何解决方案: Cancan + Devise rescue_from not catching exception
看起来 ApplicationController
默认情况下实际上并不是 RailsAdmin::MainController
的父级。因此,当 RailsAdmin::MainController
抛出 CanCan::AccessDenied
异常时,它实际上从未触及 ApplicationController
,救援块也从未启动。
您可以在 rails_admin.rb
配置块中使用
ApplicationController
作为 RailsAdmin::MainController
的父级
config.parent_controller = 'ApplicationController'
您也可以通过扩展 rails_admin 控制器来实现这一点。这是猴子修补,但如果您不想将父控制器设置为 ApplicationController
由于特殊原因,这可能很有用。
将以下内容添加到 config/initializers/rails_admin_cancan.rb
文件。
require 'rails_admin/main_controller'
module RailsAdmin
class MainController < RailsAdmin::ApplicationController
rescue_from CanCan::AccessDenied do |exception|
flash[:alert] = 'Access denied.'
redirect_to main_app.root_path
end
end
end