1

Ich verwende Authlogic, um die Authentifizierung für meine Rails-App durchzuführen. Meine Benutzer melden sich bei einer Sub-Domain an, die als Teil eines Client-Modells gespeichert ist. Benutzer gehören zu Clients und Clients authenticate_many UserSessions. Anmelden funktioniert einwandfrei; Das Problem, das ich habe, besteht darin, dass sich Benutzer in jeder Subdomain anmelden können, unabhängig davon, ob sie zum Subdomain-Client gehören oder nicht. Hier ist mein Code:Wie kann ich sicherstellen, dass Benutzer mit Authlogic zu einem bestimmten Modell gehören?

Application Controller:

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 Controller:

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 

Client-Modell:

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

    has_many :users, :uniq => true 
end 

User und Usersession Modelle:

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 

Ich verwende Rails 3 auf Mac OS X mit der neuesten Version von Authlogic installiert. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Sie müssen eine benutzerdefinierte Validierung hinzufügen.

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 

Erinnern Sie sich das current_client Attribut Accessor im UserSessions Controller einzustellen, da dies nicht anders wird im Modell zur Verfügung.

+0

Vielen Dank! Ich wusste, dass es so etwas sein musste. – mjaz