2016-07-24 3 views
-1

Я пытаюсь использовать cancancan для запрещения доступа к странице регистрации для нечленов. Только члены должны иметь возможность создавать новых членов. Я определил способность.rb, но я не знаю, как я могу запретить действие sign_up. Это то, что я пытался до сих пор:.Cancancan disallow Devise sign_up action

if user.has_role? :admin 
else 
    can :sign_in, User 
    cannot :sign_up, User 
    cannot :sign_up, Registration 
    cannot :create, User 
    cannot :create, Registration 
end 

Но все-таки я могу увидеть страницу регистрации без входа в Должен ли я достичь этого какой-то другой способ? Или я делаю что-то неправильно?

Благодаря

+0

декальцированные способности cancancan определяют только роли. вам необходимо проверить их, чтобы разрешить или запретить доступ. Проводили ли вы проверку на контроллере страницы регистрации? – infiniteRefactor

+0

Нет, у меня нет этого контроллера, возможно, у Devise. Нужно ли его каким-то образом переписать? –

ответ

1

Как @infiniteRefactor отметил, CanCanCan ограничивает доступ на основе роли. С другой стороны, независимо от того, зарегистрирован ли пользователь, это вопрос состояния (пользователи могут быть зарегистрированы или выходить независимо от роли). К счастью, вы уже используете Devise.

Вы можете получить то, что хотите, с помощью вспомогательного метода user_signed_in? от Devise.

Вы можете скрыть свой знак мнени, добавив следующий код в любой просмотра вы пытаетесь скрыть:

<% if !(user_signed_in?) %> 
    <%= redirect_to new_user_registration_path %> 
<% else %> 
    <!-- The rest of the view's code goes here --> 
<% end %> 

Затем, чтобы предотвратить фактическое действие, когда пользователь не вошел в систему, сделать убедитесь, что вы используете:

before_action :authenticate_user! 

в вашем контроллере.

+0

Я не упоминал, что я также использую rollify для проверки и установки ролей для пользователей. Основная идея заключается в том, что не каждому пользователю разрешено добавлять пользователей. Итак, хотя я понимаю, что вы говорите, я не принимаю решения на основе ролей. Предпочтительно из той же модели Способности, которую я использую, чтобы установить другие правила cancancan. –

0

Итак, вы пытаетесь использовать страницу регистрации Devise и ограничиваете доступ только для участников.

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

Вам необходимо выставить контроллеры и перезаписать контроллер регистрации. Вы можете использовать

rails generate devise:controllers users 

если ваша Разрабатывает схема пользователя users. Пожалуйста, обратитесь к разработке документации для фактической ссылки на команду. Затем вы можете настроить контроллер регистрации.

Что я предпочел бы делать здесь, будет использовать проверку способности и проверки подлинности в качестве действий контроллера.

class Devise::RegistrationsController < DeviseController 
    ... 
    before_action :authenticate_user! 
    load_and_authorize_resource 

Однако вы можете делать все, что хотите. Это та часть, которую вы хотите ограничить доступ. Вы можете ссылаться на объявление или любой другой компонент приложения.

Это в основном то, что вы просите. Но, я бы порекомендовал не, чтобы пройти этот путь.

У меня был аналогичный опыт с проектом, над которым я работаю. Я пытался создать страницу с добавлением пользователей на основе администратора и попытался использовать страницы регистрации разработки как базу и изменить их.

Однако то, что я испытал, настраивал эти контроллеры, а виды (особенно контроллеры) становятся громоздкими, когда вы начинаете изменять фактическую динамику страницы. Вы можете обнаружить, что вы копаете все глубже и глубже, чтобы гарантировать, что вся модель аутентификации работает без проблем.

Вместо этого я должен был ввести свой собственный контроллер. Так как devys предоставляет модели и методы аутентификации, довольно просто выполнить стандартную задачу, например, добавлять, удалять и обновлять пользователей. Ваши контроллеры будут очень тривиальны, ведь с cancancan может быть достаточно написать скелетный контроллер (без тела метода), используя load_and_authorize_resource, который автоматически обрабатывает операции с ресурсами.

Вы можете копировать виды разработки и использовать их с этим контроллером. Таким образом, вы предоставляете подобный интерфейс с разработкой.

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

Смежные вопросы