Почему пользователь без прав администратора имеет доступ к моей странице индекса в приложении Rails?(Придумай жемчужину) - PullRequest
0 голосов
/ 04 июня 2018

Я использую Devise Gem для аутентификации пользователей.Пользователи создают ответы на форму в приложении, и только администратор должен иметь возможность просматривать результаты, а также индекс всех пользователей, заполнивших форму.У меня есть 2 пользователя, один из которых имеет атрибут admin, установленный на «true», а другой на «false» (ранее «nil»)

Поведение, которое я ожидаю

Только пользователи, для атрибута admin которых установлено значение«true» должен иметь возможность доступа к представлениям шоу и индекса.

Что на самом деле происходит

Когда я использовал только метод authenticate_user!, который включен в Devise, он работал правильно, так как пользователи моглиПросматривать страницы показа и индекса можно только в том случае, если они вошли в систему. Однако, когда я добавил метод аутентификации, чтобы только пользователи-администраторы могли видеть страницы показа и индексации внезапно, каждый пользователь мог видеть их независимо от того, вошли они в систему или нет.,Я не понимаю, почему такое поведение происходит, потому что теперь только зарегистрированные пользователи должны видеть эти страницы в соответствии с логикой в ​​коде, насколько я понимаю.current_user также является методом Devise Gem.

У меня есть следующий код в моем контроллере Formularios (форм):

class FormulariosController < ApplicationController
  before_action :set_formulario, only: [:show, :edit, :update, :destroy]
  before_action :authenticate, only: [:show, :index]

  # GET /formularios
  # GET /formularios.json
  def index
    @formularios = Formulario.all
  end
.
.
.
.
.



  private

    def authenticate
      authenticate_user! && current_user.admin?
    end

    # Use callbacks to share common setup or constraints between actions.
    def set_formulario
      @formulario = Formulario.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def formulario_params
      params.require(:formulario).permit(:nombre, :fecha, :FdN, :direccion, :sexo, :email, :telefono, :movil, :profesion, :altura, :peso, :motivos, :especialistas, :dieta, :intolerancia, :detalles_1, :limites, :otro_1, :problema1, :p1, :p2, :p3, :problema2, :p4, :p5, :p6, :problema3, :p7, :p8, :p9, :problema4, :p10, :p11, :p12, :otro_2, :medicacion1, :m1, :m2, :m3, :m4, :m5, :m6, :medicacion2, :m7, :m8, :m9, :m10, :m11, :m12, :medicacion3, :m13, :m14, :m15, :m16, :m17, :m18, :otro_3, :suplemento1, :s1, :s2, :s3, :s4, :suplemento2, :s5, :s6, :s7, :s8, :suplemento3, :s9, :s10, :s11, :s12, :otro_4, :madre, :padre, :abuela_mat, :abuela_pat, :abuelo_mat, :abuelo_pat, :hermanos, :hermanas, :tios, :tias, :ninos, :sobrinos, :activa, :ejercicio1, :e1, :e2, :ejercicio2, :e3, :e4, :ejercicio3, :e5, :e6, :otro_5, :fumas1, :fumas2, :fumado, :alcol1, :alcol2, :alergia1, :alergia2, :habitos1, :habitos2, :habitos3, :habitos4, :galletas_tartas_bolleria, :leche, :huevos, :chocolates_dulces, :carne_roja, :carne_blanca, :pescado_blanco, :pezcado_azul, :carne_procesada, :pan, :te, :cafe, :refresco_lata, :agua, :verdura, :ensalada, :tick, :pecho, :dieta_sana, :motivacion, :desayuno1, :desayuno2, :desayuno3, :almuerzo, :almuerzo2, :almuerzo3, :cena1, :cena2, :cena3, :snacks1, :snacks2, :snacks3, :bebidas1, :bebidas2, :bebidas3)
    end
end

из schema.rb

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "admin"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

РЕДАКТИРОВАТЬ 1: User.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

1 Ответ

0 голосов
/ 04 июня 2018

Похоже, что метод аутентификации не требует ничего, кроме аутентификации пользователя.

Вы можете предпочесть что-то вроде этого:

class FormulariosController < ApplicationController
  before_action :set_formulario, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, only: [:show, :index]
  before_action :authenticate_admin, only: [:show, :index]

  # GET /formularios
  # GET /formularios.json
  def index
    @formularios = Formulario.all
  end
.
.
.
.
.



  private

    def authenticate_admin
      unless current_user.admin?
        redirect_to root_path
      end
    end

    # Use callbacks to share common setup or constraints between actions.
    def set_formulario
      @formulario = Formulario.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def formulario_params
      params.require(:formulario).permit(:nombre, :fecha, :FdN, :direccion, :sexo, :email, :telefono, :movil, :profesion, :altura, :peso, :motivos, :especialistas, :dieta, :intolerancia, :detalles_1, :limites, :otro_1, :problema1, :p1, :p2, :p3, :problema2, :p4, :p5, :p6, :problema3, :p7, :p8, :p9, :problema4, :p10, :p11, :p12, :otro_2, :medicacion1, :m1, :m2, :m3, :m4, :m5, :m6, :medicacion2, :m7, :m8, :m9, :m10, :m11, :m12, :medicacion3, :m13, :m14, :m15, :m16, :m17, :m18, :otro_3, :suplemento1, :s1, :s2, :s3, :s4, :suplemento2, :s5, :s6, :s7, :s8, :suplemento3, :s9, :s10, :s11, :s12, :otro_4, :madre, :padre, :abuela_mat, :abuela_pat, :abuelo_mat, :abuelo_pat, :hermanos, :hermanas, :tios, :tias, :ninos, :sobrinos, :activa, :ejercicio1, :e1, :e2, :ejercicio2, :e3, :e4, :ejercicio3, :e5, :e6, :otro_5, :fumas1, :fumas2, :fumado, :alcol1, :alcol2, :alergia1, :alergia2, :habitos1, :habitos2, :habitos3, :habitos4, :galletas_tartas_bolleria, :leche, :huevos, :chocolates_dulces, :carne_roja, :carne_blanca, :pescado_blanco, :pezcado_azul, :carne_procesada, :pan, :te, :cafe, :refresco_lata, :agua, :verdura, :ensalada, :tick, :pecho, :dieta_sana, :motivacion, :desayuno1, :desayuno2, :desayuno3, :almuerzo, :almuerzo2, :almuerzo3, :cena1, :cena2, :cena3, :snacks1, :snacks2, :snacks3, :bebidas1, :bebidas2, :bebidas3)
    end
end

Тогда, если пользователь не является администратором, он перенаправляется на корневой путь приложения для действия show и index.

EDIT

На самом деле, я не слишком уверен в том, что authenticate_user! && current_user.admin? делает, поскольку это не является частью оператора if else.Конечно, это потребует аутентификации пользователя, но я даже не уверен, что вторая часть даже вызывает ... если не ошибка.

(кстати, я все еще новичок в Rails, поэтому я не знаком со всеми видами Railsсинтаксисы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...