Ruby on Rails - before_action作为动作防御器

时间:2016-09-06 21:51:00

标签: ruby-on-rails ruby controller

修改:最初的目标是使用WM_CLOSE作为before_action操作的阻止程序,对于非Admin和Current的用户。换句话说,只允许管理员或当前用户执行show操作。根据我的经验,我了解到实现它的简单方法是阻止执行内部的执行,但这会导致代码重复。

原文:我正在尝试构建一些复杂的before_action配置:

enter image description here

在布尔逻辑中我可以将其配置为: Logged_in和(管理员或当前)

Logged_in / Not Logged in,Admin and Current功能已定义

show

它应该由定义的逻辑

起作用

1 个答案:

答案 0 :(得分:1)

你在这里混淆了两个截然不同的东西 - 身份验证和授权。

你真的不需要一个非常复杂的逻辑门 - 你需要为每个问题分开回调。

class ApplicationController < ActionController::Base

  private

    def authenticate_user!
      flash[:error] = "Please sign in."
      redirect_to new_session_path and return
    end
end

因此,让我们设置一个非常简单的身份验证和授权示例。规则如下:

  • 任何访问者都可以查看索引并显示
  • 任何已登录的用户都可以创建新书
  • 创建图书或管理员的用户可能会更改现有记录
class BooksController < ApplicationController

  before_action :authenticate_user!, except: [:show, :index]
  before_action :set_book, except: [:new, :index]
  before_action :authorize!, except: [:new, :create, :show, :index]

  private 

    def set_book    
      @user = Book.find(params[:id])
    end

    def authorize!
      unless @book.user == current_user || current_user.admin?
        redirect_to users_path, alert: 'You are not authorized.' and return
      end
    end
end

但是,您应该首先整合和学习现有的解决方案,例如Devise,CanCanCan和Pundit。当你掌握了自己可以自己动手的时候。