2011-06-12 15 views
6

Estoy usando el dispositivo para la autenticación en la aplicación Rails, y mi aplicación puede tener muchos subdominios. Actualmente está utilizando el correo electrónico como autenticación, y el correo electrónico debe ser exclusivo para toda la aplicación.Scoping email to subomain en idee rails

Ahora, ¿hay alguna forma de que pueda abarcar la exclusividad de la dirección de correo electrónico a los subdominios, no toda la aplicación? Traté:

validates_uniqueness_of :email, :scope => :account_id 

Pero no funcionó. Todavía busca la exclusividad del correo electrónico para toda la aplicación, no el subdominio específico al registrar un nuevo usuario.

Cualquier ayuda sería muy apreciada.

+0

¿Dónde se almacena el nombre del subdominio en la tabla de Usuario? – Dogbert

+0

Tengo el modelo de Cuenta que almacena el nombre del subdominio. Y la Cuenta tiene una relación has_ ​​manyy con el modelo de Usuario. Y he intentado anteriormente validado_uniqueness_of en mi modelo de usuario, pero en vano .. :( – kxhitiz

+0

¿Podría agregar una esencia básica de los modelos (Cuenta, Usuario) con las relaciones (has_many, belongs_to) entre ellos y los atributos relevantes que almacenan? – Dogbert

Respuesta

7

Ok, lo hice de esta manera.
config.authentication_keys Editado en devise.rb como

config.authentication_keys = [ :login, :account_id ] 

También creé campo oculto para incluir account_id en forma de la conexión

<%= f.hidden_field :account_id, :value => @account.id %> 

Aquí @account mantenga presionada la cuenta relacionada con subdominio actual.

Y añade el siguiente método protegido en user.rb para anular método de clase find_for_database_authentication

protected 
def self.find_for_database_authentication(warden_conditions) 
conditions = warden_conditions.dup 
login = conditions.delete(:login) 
account_id = conditions.delete(:account_id) 
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).where("account_id = ?", account_id).first 
end 

Si hay una mejor solución, entonces no dude en comentar chicos ..
Salud!

+0

¿hay alguna manera de, en lugar de tener el account_id en el formulario, para encontrarlo desde el subdominio? Para aplicaciones más grandes, no es cómodo exponer identificadores de cuenta .: - \ – NullVoxPopuli

+0

La confirmación no funciona con esta solución. –

+0

¿Cómo hacer que la confirmación funcione con el correo electrónico del usuario con el ámbito de account_id? –

0

¿Cómo está guardando a sus usuarios, está configurando la cuenta en el modelo de usuario antes de intentar guardarlo? De lo contrario, tendrá acceso a un account_id of nil; por lo tanto, parecerá que no hay alcance.