Как я могу убедиться, что пользователи принадлежат определенной модели, использующей Authlogic? - PullRequest
1 голос
/ 31 декабря 2010

Я использую Authlogic для аутентификации в моем приложении Rails. Мои пользователи входят в поддомен, который хранится как часть модели клиента. Пользователи принадлежат клиентам и клиентам authenticate_many UserSessions. Вход в систему работает нормально; у меня проблема в том, что пользователи могут войти в любой поддомен независимо от того, принадлежат ли они клиенту этого субдомена Вот мой код:

Контроллер приложений:

class ApplicationController < ActionController::Base
  helper_method :current_user_session, :current_user, :current_client

  private

  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.user
  end

  def current_client
    subdomain = request.subdomain

    if subdomain.present? && subdomain != 'www'
      @current_client = Client.find_by_subdomain(subdomain)
    else
      @current_client = nil
    end
  end
end

Контроллер UserSessions:

class UserSessionsController < ApplicationController
  def new
    @user_session = current_client.user_sessions.new
  end

  def create
    params[:user_session][:client] = current_client
    @user_session = current_client.user_sessions.new(params[:user_session])
    if @user_session.save
      redirect_to dashboard_path
    else
      render :action => 'new'
    end
  end
end

Модель клиента:

class Client < ActiveRecord::Base
  authenticates_many :user_sessions, :find_options => { :limit => 1 } 

  has_many :users, :uniq => true
end

Модели User и UserSession:

class User < ActiveRecord::Base
  belongs_to :client

  acts_as_authentic do |c|
    c.validations_scope = :client_id
  end
end

class UserSession < Authlogic::Session::Base
end

Я использую Rails 3 на Mac OS X с последней установленной версией Authlogic. Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 31 декабря 2010

Вам нужно будет добавить пользовательскую проверку.

 class UserSession

   attr_accessor :current_client
   before_validation :check_if_user_of_client

   private
     def check_if_user_of_client
       errors.add(:base, "Not your client/subdomain etc.") unless client.eql?(current_client) # client.eql? == self.client.eql? the associated client of current_user
     end
 end

Не забудьте установить средство доступа к атрибуту current_client в контроллере UserSessions, так как иначе это не будет доступно в модели.

...