Как разрешить просмотр указанных ресурсов до входа пользователя? - PullRequest
0 голосов
/ 27 сентября 2019

Я хотел бы разрешить пользователям просматривать свойства до того, как они войдут в систему. Но мой контроллер приложений ограничивает все ресурсы до того, как они будут авторизованы. Как я могу разрешить просмотр ресурса свойств независимо от того, вошел ли пользователь в систему?или нет?

Я пытался добавить свойства к методу authorized в application_controller и добавить skip_before_action :authorized, only: [:index] и authorize! в properties_controller.

class ApplicationController < ActionController::API
    before_action :authorized

  def encode_token(payload)
    # should store secret in env variable
    JWT.encode(payload, 'SECRET_KEY_BASE')
  end

  def auth_header
    request.headers['Authorization']
  end

  def decoded_token
    if auth_header
      token = auth_header.split(' ')[1]
      begin
        JWT.decode(token, 'SECRET_KEY_BASE', true, algorithm: 'HS256')
      rescue JWT::DecodeError
        nil
      end
    end
  end

  def current_investor
    if decoded_token
      investor_id = decoded_token[0]['investor_id']
      @investor = Investor.find_by(id: investor_id)
    end
  end

  def logged_in?
    !!current_investor
  end

  def authorized
    render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
  end
end
class Api::V1::PropertiesController < ApplicationController

    def index 
        properties = Property.all
        render json: PropertySerializer.new(properties).to_serialized_json
    end

    def create
        property = Property.new(property_params)
        if property.save!
            render json: property_params
        else
            render :new 
        end
    end

    private 

    def property_params
        params.require(:id, :price, :rent, :year_built, :last_year_appreciation, :next_year_appreciation, :lease_length, :beds_baths_sqft, :description, :zone, :address)
    end
end

Я бы хотел, чтобы весь ресурс свойств был доступен независимо от того, вошел ли пользователь в систему. Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

skip_before_action: санкционировано, кроме: [: index] Попытка при этом пропустит метод индекса аутентификации, где свойства могут быть видны без входа в систему пользователя.

0 голосов
/ 29 сентября 2019

Здесь в ApplicationController вы звоните before_action :authorized, так что это будет вызываться в каждом controller, то есть inherited из ApplicationController.

Так что я предлагаю вам удалитьbefore_action filter из ApplicationController и поместите его в соответствующий controller.Таким образом, ваш код может выглядеть примерно так:

class ApplicationController < ActionController::API
      def encode_token(payload)
    # should store secret in env variable
    JWT.encode(payload, 'SECRET_KEY_BASE')
  end

  def auth_header
    request.headers['Authorization']
  end

  def decoded_token
    if auth_header
      token = auth_header.split(' ')[1]
      begin
        JWT.decode(token, 'SECRET_KEY_BASE', true, algorithm: 'HS256')
      rescue JWT::DecodeError
        nil
      end
    end
  end

  def current_investor
    if decoded_token
      investor_id = decoded_token[0]['investor_id']
      @investor = Investor.find_by(id: investor_id)
    end
  end

  def logged_in?
    !!current_investor
  end

  def authorized
    render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
  end
end

А в вашем PropertiesController Вы можете сделать что-то подобное, чтобы метод authorized не вызывался для действия index.

class Api::V1::PropertiesController < ApplicationController
    before_action :authorized, only: [:create]

    def index 
        properties = Property.all
        render json: PropertySerializer.new(properties).to_serialized_json
    end

    def create
        property = Property.new(property_params)
        if property.save!
            render json: property_params
        else
            render :new 
        end
    end

    private 

    def property_params
        params.require(:id, :price, :rent, :year_built, :last_year_appreciation, :next_year_appreciation, :lease_length, :beds_baths_sqft, :description, :zone, :address)
    end
end
0 голосов
/ 27 сентября 2019
class Api::V1::PropertiesController < ApplicationController
    skip_before_action :authorized!
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...