отображать части шаблона в зависимости от роли пользователя - PullRequest
0 голосов
/ 04 мая 2018

Мой вопрос касается отображения только тех частей шаблона, на которые авторизован пользователь. Предположим, что есть проект только с пользователями и ролями пользователей и сгенерированными шаблонами и контроллерами phx.gen.html. Настраивая маршруты "/ users", мы получаем красивую таблицу со всеми пользовательскими данными и кнопками для "show", "edit" и "delete".

Роли пользователя могут быть просто обычным пользователем и администратором. Теперь я хочу, чтобы администратор мог удалять и редактировать всех пользователей, но «пользователь» должен иметь возможность редактировать только самого себя, и в чем заключается мой вопрос, он должен видеть только эти кнопки для своей записи.

Я уже настроил некоторые плагины для соответствующих действий, поэтому обычный «пользователь» не может редактировать, удалять или даже показывать другим пользователям, но он даже не должен знать о возможности сделать это. Итак, я хочу спрятать эти кнопки. Вот решения, с которыми я сталкивался или сталкивался, но все они, похоже, не совсем применимы.

  1. Использование маршрута "/ admin" и ограничение доступа к нему. Похоже, что этот способ используется в основном, но я не хочу этого делать, так как в моем случае администратор является только привилегированным обычным пользователем, и для администраторов практически нет необходимости в полном маршруте. Мне бы пришлось создавать новые контроллеры, новые шаблоны и т. Д.
  2. Итак, моей следующей мыслью было: «Просто создайте другой шаблон и удалите эти кнопки из шаблона пользователя». Ну, это работает, но это в основном так же, как 1). Мне пришлось бы дублировать контент для всех index.html и некоторых других шаблонов. Кроме того, если я хочу добавить другую роль, может быть, «менеджер» или что-то еще, я должен дублировать ее снова. Похоже, что со временем это невозможно отремонтировать.
  3. Добавление некоторой логики в сам шаблон, например <% = if is_admin? делать%> html-вещи <% end%>. Я знаю, что в данный момент это не повредит, так как я дважды проверяю разрешения с помощью своих разъемов в контроллере, но в любом случае ... это также кажется "грязным", так как я не хочу эту логику в шаблоне.

Кто-нибудь получил другую идею или, может быть, ссылку на кого-то, кто обсуждал это? Мне удалось найти только статьи о 1) и о том, как это реализовать.

1 Ответ

0 голосов
/ 04 мая 2018

Мне нравится хранить логику разрешений в одном месте и использовать ее как в контроллере, так и в шаблоне. Вдохновленный старым cancan гемом Ruby on Rails, я определяю функцию как:

defmodule MyApp.Can do
  def can?(_user, :create, Post), do: true
  def can?(user, :delete, %Post{} = post), do: user.is_admin || post.user_id == user.id
  ...
end

Теперь в контроллере используйте эту функцию для авторизации:

def delete(...) do
  ...
  if MyApp.Can.can?(current_user, :delete, post) do
    ...
  else
    ...
  end
end

И в шаблоне:

<%= MyApp.Can.can?(@current_user, :delete, @post) %> <Delete Button> <% end %>
...