1

Authlogic을 사용하여 Rails 앱의 인증을 수행하고 있습니다. 내 사용자는 클라이언트 모델의 일부로 저장된 하위 도메인에 로그인합니다. 사용자는 belongs_to 클라이언트이고 클라이언트는 authenticate_many UserSessions입니다. 로그인이 정상적으로 작동합니다. 내가 가지고있는 문제는 사용자가 해당 하위 도메인의 클라이언트에 속해 있는지 여부에 관계없이 모든 하위 도메인에 로그인 할 수 있다는 것입니다.사용자가 Authlogic을 사용하여 특정 모델에 속하게하려면 어떻게해야합니까?

응용 프로그램 컨트롤러 :

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 

사용자 및 사용자 세션 모델 :

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 
0 여기에 내 코드입니다

나는 Authlogic의 최신 버전이 설치된 Mac OS X에서 Rails 3를 실행 중입니다. 어떤 도움을 많이 주시면 감사하겠습니다!

답변

1

사용자 지정 유효성 검사를 추가해야합니다.

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 

UserSessions 컨트롤러에 current_client 속성 접근자는 설정해야합니다. 그렇지 않으면 모델에서 사용할 수 없게됩니다.

+0

감사합니다. 나는 그것이 이런 식으로되어야한다는 것을 알았다. – mjaz

관련 문제