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 

ユーザーと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 

私は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

関連する問題