Как мне реализовать аутентификацию / авторизацию с несколькими моделями, использующими Rails? - PullRequest
7 голосов
/ 18 января 2012

В моем приложении 3 вида пользователей: Клуб, Персона и Администратор .Каждый из них сильно отличается друг от друга, что означает, что они почти не разделяют никаких атрибутов, кроме данных аутентификации, поэтому я бы предпочел использовать 3 разных модели .Кроме того, я хочу включить единую модель аутентификации для всех этих типов пользователей, используя Authlogic , и обрабатывать авторизацию, используя CanCan .

Изначально я думал о чем-то вродеthis.

class User < ActiveRecord::Base
 # This class has the email and password in order to be authenticated with Authlogic
end

И для каждого из них у меня будет

class Club < User end
class Admin < User end

Но тогда таблица User будет захламлена всеми столбцами других типов пользователей, и они останутся нулевыми.

Другой вариант будет

class User < ActiveRecord::Base
 # This class has the email and password in order to be authenticated with Authlogic
 belongs_to :role, :polymorphic => true
end

И для каждого типа пользователя будет назначена роль.Проблема в том, что доступ к свойствам метода будет выглядеть примерно так: user.role.logo.Один из способов решить эту проблему - использовать делегат, но все же я не знаю, лучший ли это вариант.

Вопрос в том, как бы вы предложили мне реализовать это?Какой будет лучший способ?

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Как вы предлагаете, я бы создал модель User для обработки аутентификации.Затем вы можете создать полиморфные отношения один-к-одному между моделью User и моделями ваших ролей.Ваша модель пользователя должна включать атрибуты role_type (который является строкой) и role_id (который является целым числом).

User.rb

class User < ActiveRecord::Base
  belongs_to :role, :polymorphic => true
end

Admin.rb

class Admin < ActiveRecord::Base
  has_one :role
end

Вы можете проверить, к какому классу относится роль пользователя, и получить доступ к его атрибутам.Например:

User.first.role.is_a? Admin
=> true
User.first.role.last_name
=> "Smith"
1 голос
/ 18 января 2012

Я думаю, вы пытаетесь добиться авторизации на основе ролей.Взгляните на вики-страницу на канкане.

https://github.com/ryanb/cancan/wiki/Role-Based-Authorization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...