为具有admin属性的用户设计定义路线和before_filter

阿古斯甘比纳

我有一个小应用程序,可以在其中实现设计。在这里我补充设计出模型consultant来代替user

class Consultant < ApplicationRecord
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def admin?
    self.admin == true
  end

end

我还添加了一个属性,例如在这里建议使用选项2来标识管理员用户。

我的目标是实现只有管理员顾问才能随处访问。非管理员顾问只能访问resources :tasksget '/tasks/consultants/:id/worked', to: 'tasks#worked'访问者应重定向到sign_in。

为此目的,我增加了before_filterApplicationController这样的

class ApplicationController < ActionController::Base

  before_filter :authenticate_admin!
  skip_before_filter :authenticate_admin!, only: [:tasks]

  private
  def authenticate_admin!
    current_consultant.try(:admin?)
  end

end

然后tasks_controller.rb我添加了这个before_filter

class TasksController < ApplicationController
  before_action :set_task, only: [:show, :edit, :update, :destroy]

  before_filter :authenticate_consultant!

  ...

routes.rb的定义是这样的

Rails.application.routes.draw do

  devise_for :consultants
  devise_scope :consultant do
    authenticated :consultant do
      root 'tasks#index'
    end

    root to: "devise/sessions#new"
  end

  get '/home', to: 'static_pages#home'
  get '/help', to: 'static_pages#help'

  get   '/tasks/consultants/:id/worked', to: 'tasks#worked'

  resources :tasks
  resources :consultants

end

我不明白为什么不验证用户,任何用户都可以在任何地方访问


更新1

只是一个小纸条,我更改了所有内容before_filterbefore_action因为before_filter已弃用

正如@Raffael建议的那样,我将我更新application_controller.rb

class ApplicationController < ActionController::Base

  before_action :authenticate_admin!

  def authenticate_admin!
    unless current_consultant.try(:admin?)
      flash[:error] = 'Shoo, this is not for you'
      redirect_to root_path
    end
  end

end

但我得到一个错误

本地主机将您重定向了太多次。

我认为这是因为我正在从routes.rb重定向application_controller.rb尝试访问时,devise/sessions#new需要进行身份验证。

我试图通过将以下内容添加到的before_action中来避免这种情况 application_controller.rb

before_action :authenticate_admin!, :except => ['devise/sessions#new']

更新2:解决方案

最后,这就是我所做的,首先我创建了一个新文件,名为 admin_controller.rb

class AdminController < ApplicationController

  before_action :authenticate_admin!

  protect_from_forgery with: :null_session

  def authenticate_admin!
    unless current_consultant.try(:admin?)
      flash[:error] = 'Shoo, this is not for you'
      redirect_to root_path
    end
  end

end

其次,对于需要管理员权限的控制器,我是从这样的新类扩展而来的

class AnyController < AdminController

application_controller.rb

class ApplicationController < ActionController::Base

  before_action :authenticate_consultant!, :except => ['devise/sessions#new']

  protect_from_forgery with: :null_session

end

和在 routes.rb

Rails.application.routes.draw do

  devise_for :consultants

  root to: 'tasks#index'
...

这不是一个优雅的解决方案,但它可以工作。例如,最好将所有管理控制器都放在自己的名称空间中。

拉斐尔

从过滤器返回一个假值不会再终止过滤器链(在以前的Rails版本中确实如此)。

如果要before_filter阻止执行控制器操作,则需要重定向或渲染。

例如:

def authenticate_admin!
  unless current_consultant.try(:admin?)
    flash[:error] = 'Shoo, this is not for you'
    redirect_to root_path
  end
end

或者:

def authenticate_admin!
  unless current_consultant.try(:admin?)
    flash[:error] = 'You need to be logged in as an admin to use this resource'
    render 'login_dialog'
  end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

设计其他用户字段,嵌套模型/属性和自定义路线

来自分类Dev

跳过使用块定义的before_filter

来自分类Dev

Rails:与方法的before_filter有关

来自分类Dev

如何测试设计gem before_filter:authenticate_user!行为

来自分类Dev

为所有具有值和标签属性的嵌套结构定义自定义类型

来自分类Dev

在我的before_filter子句中获取未定义的方法

来自分类Dev

设计自定义用户属性的祖先

来自分类Dev

设计自定义用户属性的祖先

来自分类Dev

控制器before_filter无效

来自分类Dev

Rails before_filter不同的参数

来自分类Dev

继承“before_filter”风格的方法

来自分类Dev

Rails,Active Admin,设计,路线

来自分类Dev

具有ID和名称的Laravel路线

来自分类Dev

Rails 3设计:“隐藏”具有“属性”为true的条目,但仅在api级别上

来自分类Dev

Django - 具有 ModelForm 的属性和重新定义的字段?

来自分类Dev

具有尚未定义的属性且那些属性被定义为undefined的窗口

来自分类Dev

Rails:设计具有未知属性的模型

来自分类Dev

如何在 DJANGO 的自定义 ADMIN 页面中将用户“id”和用户“profile”更新为超级用户

来自分类Dev

具有多个角色和多个团队的用户数据库设计

来自分类Dev

在 rails 中创建具有相同形式的设计用户和配置文件模型

来自分类Dev

MatLab:生成 N 个具有泊松分布的伪随机数,其均值为 M 和总 T,其中 N、M 和 T 是用户定义的

来自分类Dev

Rails-设计路线和Sidekiq路线

来自分类Dev

具有完全自定义getter和setter的属性的“弱”和“复制”属性

来自分类Dev

参数传递到before_filter方法调用中?

来自分类Dev

before_filter:authenticate_user !,除了:[:index] / Rails 4

来自分类Dev

before_filter不被称为Rails 4

来自分类Dev

参数传递到before_filter方法调用中?

来自分类Dev

使用gsub方法的模型上的before_filter

来自分类Dev

如何将ProFTPD配置为具有系统用户,PK身份验证和自定义umask的仅SFTP服务器?

Related 相关文章

  1. 1

    设计其他用户字段,嵌套模型/属性和自定义路线

  2. 2

    跳过使用块定义的before_filter

  3. 3

    Rails:与方法的before_filter有关

  4. 4

    如何测试设计gem before_filter:authenticate_user!行为

  5. 5

    为所有具有值和标签属性的嵌套结构定义自定义类型

  6. 6

    在我的before_filter子句中获取未定义的方法

  7. 7

    设计自定义用户属性的祖先

  8. 8

    设计自定义用户属性的祖先

  9. 9

    控制器before_filter无效

  10. 10

    Rails before_filter不同的参数

  11. 11

    继承“before_filter”风格的方法

  12. 12

    Rails,Active Admin,设计,路线

  13. 13

    具有ID和名称的Laravel路线

  14. 14

    Rails 3设计:“隐藏”具有“属性”为true的条目,但仅在api级别上

  15. 15

    Django - 具有 ModelForm 的属性和重新定义的字段?

  16. 16

    具有尚未定义的属性且那些属性被定义为undefined的窗口

  17. 17

    Rails:设计具有未知属性的模型

  18. 18

    如何在 DJANGO 的自定义 ADMIN 页面中将用户“id”和用户“profile”更新为超级用户

  19. 19

    具有多个角色和多个团队的用户数据库设计

  20. 20

    在 rails 中创建具有相同形式的设计用户和配置文件模型

  21. 21

    MatLab:生成 N 个具有泊松分布的伪随机数,其均值为 M 和总 T,其中 N、M 和 T 是用户定义的

  22. 22

    Rails-设计路线和Sidekiq路线

  23. 23

    具有完全自定义getter和setter的属性的“弱”和“复制”属性

  24. 24

    参数传递到before_filter方法调用中?

  25. 25

    before_filter:authenticate_user !,除了:[:index] / Rails 4

  26. 26

    before_filter不被称为Rails 4

  27. 27

    参数传递到before_filter方法调用中?

  28. 28

    使用gsub方法的模型上的before_filter

  29. 29

    如何将ProFTPD配置为具有系统用户,PK身份验证和自定义umask的仅SFTP服务器?

热门标签

归档