Ruby on rails Rails-使用具有单独管理命名空间的Pundit
我目前有一个设计和专家在一个封闭的系统中工作得很好,需要用户登录才能看到任何东西 新目标:如何使用Pundit要求AdminUser登录以访问Admin命名空间 我有一个单独的AdminUser模型、单独的管理员控制器、策略和命名空间: routes.rbRuby on rails Rails-使用具有单独管理命名空间的Pundit,ruby-on-rails,devise,authorization,ruby-on-rails-5,pundit,Ruby On Rails,Devise,Authorization,Ruby On Rails 5,Pundit,我目前有一个设计和专家在一个封闭的系统中工作得很好,需要用户登录才能看到任何东西 新目标:如何使用Pundit要求AdminUser登录以访问Admin命名空间 我有一个单独的AdminUser模型、单独的管理员控制器、策略和命名空间: routes.rb namespace :admin do root to: 'home#index' resources :users end devise_for :admin_users, skip: [:sessions] as :admin_
namespace :admin do
root to: 'home#index'
resources :users
end
devise_for :admin_users, skip: [:sessions]
as :admin_user do
get 'admin/signin', to: 'admin/devise/sessions#new', as: :new_admin_user_session
post 'admin/signin', to: 'admin/devise/sessions#create', as: :admin_user_session
delete 'admin/signout', to: 'admin/devise/sessions#destroy', as: :destroy_admin_user_session
end
class Admin::AdminController < ApplicationController
end
class Admin::HomeController < Admin::AdminController
def index
authorize [:admin, :home]
end
end
控制器/admin/admin\u控制器.rb
namespace :admin do
root to: 'home#index'
resources :users
end
devise_for :admin_users, skip: [:sessions]
as :admin_user do
get 'admin/signin', to: 'admin/devise/sessions#new', as: :new_admin_user_session
post 'admin/signin', to: 'admin/devise/sessions#create', as: :admin_user_session
delete 'admin/signout', to: 'admin/devise/sessions#destroy', as: :destroy_admin_user_session
end
class Admin::AdminController < ApplicationController
end
class Admin::HomeController < Admin::AdminController
def index
authorize [:admin, :home]
end
end
策略/admin/home\u policy.rb(管理名称空间的示例子策略)
class Admin::HomePolicy
这两个策略的设置方式与我的用户策略相同,因此不寻找AdminUser。我如何才能使这些功能适用于我的AdminUser模型?我认为您的思路是正确的。您已经为管理控制器创建了一个命名空间,该命名空间继承自
admin::AdminController
。Pundit将一个名为Pundit\u user
的助手方法注入到ApplicationController
中,默认情况下,该方法只返回当前用户
虽然您可以考虑不使用单独的管理模型,而是使用适当的授权设置,但对于每种情况都可能不方便。我只是想把它摆出来让你想想
我能想到的解决此问题的最简单方法是,简单地重写Admin::AdminController
中的helper方法,如下所示:
class Admin::AdminController < ApplicationController
def pundit_user
current_admin_user
end
end
class Admin::AdminController
请注意,这确实假设AdminUser模型是沿着谢谢!我在Github页面上发现了这个片段,并假设它需要在AdminPolicy中。我花了几个小时尝试了无数种方法让它工作,它只需要在控制器中。哦!谢谢你,雅普!