Как обрабатывать опциональный логин в рельсах - PullRequest
2 голосов
/ 10 августа 2010

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

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

Ответы [ 2 ]

1 голос
/ 10 августа 2010

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

Если вы используете cancan, вы определяете, что пользователь может / не может делать в models /ility.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 .

0 голосов
/ 31 августа 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

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

...