Как ограничить доступ к разным страницам в Rails? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть контроллер Пользователи :

class UsersController < ApplicationController
  ......
  def show
    @user = User.find(params[:id])
  end

  def index
    @users = User.paginate(page: params[:page], per_page: 25)
  end
  ......    
end

Теперь профили пользователей находятся в / users / 1 , / users / 2 ,и т. д. и список пользователей находится по адресу / users / .

Я хочу предоставить специальный доступ:

  • пользователь может видеть только собственный профиль
  • Администратор может видеть список пользователей и любой профиль

Как я могу ограничить доступ таким образом?

Ответы [ 4 ]

0 голосов
/ 24 ноября 2018

Учитывая ваш URL user/1/ вы берете идентификатор параметра и сравниваете его с текущим идентификатором пользователя в хуке:

before_action :auth_user

private

def auth_user
  unless params[:id].to_s == current_user.id.to_s
redirect_to root_path
end

Что касается администратора, у вас, вероятно, есть выделенное пространство имен с еще более тщательными проверками, где можно посмотреть профили пользователей.

0 голосов
/ 23 ноября 2018

Если у вас определен current_user и ваш класс User имеет атрибут admin, вы можете сделать следующее:

class UsersController < ApplicationController
  ......
  def show
    @user = User.find(params[:id])
    if current_user.admin || @user == current_user
      # render the show screen
    else
      # redirect to wherever
    end
  end

  def index
    if current_user.admin
      @users = User.paginate(page: params[:page], per_page: 25)
      # render the index screen
    else
      # redirect to wherever
    end

  end
  ......    
end

Или вы можете просто использовать один из множества драгоценных камней авторизациитам, как Канканкан или Пандит.

0 голосов
/ 23 ноября 2018

Я бы, вероятно, справился бы с этим, имея две разные конечные точки, что-то вроде /profile и /admin/users/1.Тогда у вас есть разные контроллеры для них:

UserProfileController < ApplicationController
  def show
    @user = current_user
  end
end

и:

class Admin::UsersController < AdminController
  def show
    @user = User.find(params[:id])
    render 'user_profile/show' # or another template if you like
  end
end

class AdminController < ApplicationController
  before_action :ensure_admin

  def ensure_admin
    if !current_user.admin?
      raise ActionController::RoutingError, 'Not Found'
    end
  end
end
0 голосов
/ 22 ноября 2018

Вы должны использовать библиотеки ACL, такие как cancancan или pundit или ruby-toolbox.com

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