Как структурировать аутентифицированные маршруты при использовании Devise?

В моем вопросе Как получить корневой вид когда пользователь не вошел в систему rails? max ответил, что мы можем использовать authenticated, чтобы сделать маршруты доступными только тогда, когда кто-то аутентифицирован. У меня есть проблема, как я могу структурировать это:

Rails.application.routes.draw do
  devise_for :users


  authenticated :user do
    # when authenticated allow all action on student
    resources :subjects do 
      resources :students
    end
  end

  # when not only allow read on student
  resources :subjects do 
    resources :students, only: [:get]
  end

  root "home#index"
end

Проблема в том, что я не хочу разрешать какие-либо действия без аутентификации на :subjects, как это остановить?


person aks    schedule 16.04.2017    source источник


Ответы (2)


Если вы хотите ограничить доступ к субъектам, вы должны сделать это на уровне контроллера, а не в маршрутах. Использование before_action :authenticate_user! даст ответ 401 Unauthorized и перенаправит на вход.

class ApplicationController
  # secure by default
  before_action :authenticate_user!, unless: :devise_controller?
end

class SubjectsController < ApplicationController
  # whitelist actions that should not require authentication
  skip_before_action :authenticate_user!, only: [:show, :index]
  # ...
end

Rails.application.routes.draw do
  devise_for :users

  resources :subjects do 
    resources :students
  end

  root "home#index"
end

Использование помощников маршрута authenticated и unauthenticated полезно, когда вы хотите иметь разные ответы для одного и того же маршрута для аутентифицированных и неаутентифицированных пользователей, но это не то, как вы должны структурировать свое приложение.

Если вы просто используете authenticated в своих маршрутах, пользователи, не прошедшие проверку подлинности, получат ответ 404 Not Found вместо запроса на вход в систему. Что бесполезно.

Также resources :students, only: [:get] вообще не генерирует никаких маршрутов. Параметр only предназначен для ограничения действий (показать, индексировать, изменить, обновить...), а не метода HTTP. Используйте rake routes, чтобы увидеть маршруты в вашем приложении.

person max    schedule 16.04.2017

Вот простой способ структурировать аутентифицированные и неаутентифицированные маршруты.

В app/controllers/application_controller.rb добавьте "before_action :authenticate_user!".

Мой файл app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base

protect_from_forgery with: :exception

before_action :authenticate_user!
end

Мой конфиг/routes.rb:

Rails.application.routes.draw do
  devise_for :users
  root "home#index"
  devise_for :users, controllers: {
                       :sessions => "users/sessions",
                       :registrations => "users/registrations" }
  authenticated :user do
      resources :students
  end



unauthenticated :user do
  #Some route
  end

end
person Katta Naveen Kumar    schedule 14.04.2018