CanCan для авторизации . Authlogic и Devise предназначены для аутентификации . Авторизация и аутентификация - это два разных, но обычно связанных аспекта веб-приложения.
У меня такое ощущение, что вы не можете использовать has_many :through
для ссылки на has_and_belongs_to_many
ассоциацию. Я думаю, что has_many :through
должен ссылаться на has_many
ассоциацию. Я не мог найти какую-либо определенную информацию, хотя. Может кто еще знает?
Я никогда не запускаю свою собственную аутентификацию, потому что Devise и Authlogic отлично справляются со своей работой и их легко расширять (особенно Devise). Лучшие практики для безопасного хеширования встроены. OpenID и Facebook аутентификация являются простыми надстройками. Зачем заново изобретать колесо? В худшем случае они останутся без поддержки когда-нибудь в будущем. Для меня это не имеет большого значения, потому что у меня все еще есть исходный код, поэтому мне нечего терять, и все можно получить.
Если вам не нужны ваши разрешения, будьте динамическими, я бы жестко запрограммировал ваши разрешения (то есть действия, которые могут выполнять пользователи в определенных ролях) в файл возможностей CanCan. Вам, вероятно, также не нужна таблица базы данных для ролей, если нет дополнительных метаданных, которые вы хотите сохранить. Я рекомендую избегать ассоциаций has_and_belongs_to_many, потому что большинству приложений в конечном итоге потребуются дополнительные данные, связанные с присоединяющейся таблицей. Это было бы одним из решений для рассмотрения. Есть более простые и более сложные способы достичь того же.
class User < ActiveRecord::Base
has_many :roles
end
class RoleAssignment < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :role_assignements
has_many :users, :through => :role_assigments
end
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.roles.include? Role.find_by_name('admin')
can :manage, :all
else
can :read, :all
end
end
end