Как обрабатывать необязательный вход в рельсы

Я создаю приложение rails, где вход в систему не является обязательным. Другими словами, многие из одних и тех же действий/представлений/контроллеров/страниц будут работать как при входе, так и при выходе из системы. Вы просто получаете больше функциональности, если вы вошли в систему (например, приложение запоминает, что вы сделали).

В настоящее время я использую restful_authentication и role_requirement и задаюсь вопросом, какой уровень использовать. Я мог бы добавить новую роль «пользователь», которую получают, например, все вошедшие в систему пользователи, а затем require_role "user" и блокировать просмотр с помощью @user.has_role? ... или вместо этого я мог бы улучшить аутентификацию и проверить, является ли пользователь аутентифицированный. Или я мог бы сделать что-то еще. Есть ли стандартный способ обработки этого в рельсах?


person Simon Woodside    schedule 10.08.2010    source источник


Ответы (2)


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

Если вы используете канкан, вы должны определить, что пользователь может/не может делать в models/ability.rb.

class Ability
    include CanCan::Ability

    def initialize(user)
      if user.admin?
        can :manage, :all
      else
        can :read, :all
      end
    end
end

Затем, по вашему мнению, вы можете авторизовать функции на основе роли пользователя:

<% if can? :update, @article %>
    <%= link_to "Edit", edit_article_path(@article) %>
<% end %>

Если вам нужно больше возможностей, вы можете рассмотреть другой гем авторизации, такой как declarative_authorization.

person Joshua Partogi    schedule 10.08.2010

Нет необходимости проверять авторизацию для действий, которые разрешены всем пользователям.

Если у вас есть авторизация по умолчанию в вашем ApplicationController, например:

before_filter :authorize

Затем либо удалите это полностью, и добавьте его обратно только для тех действий, которые требуют авторизации, либо в каждом контроллере вы можете отключить его с помощью:

skip_before_filter :authorize, :only => [:action_method_name]

У вас должен быть простой метод в вашем ApplicationController, где вы можете передать роль и получить true, если текущий пользователь авторизован:

def authorized? role
  return true if current_user.roles.collect{|r| r.name.to_sym}.include(role.to_sym)
  false
end

Затем вы можете процедурно проверить любую роль, которую вы хотите в своих действиях.

person aceofspades    schedule 31.08.2010
comment
Я также хотел бы, чтобы на некоторых страницах отображались разные представления, если пользователь вошел в систему, а не вошел в систему. Есть ли совет по этому поводу? - person Simon Woodside; 02.09.2010