Любой ленивый способ сделать аутентификацию на RoR? - PullRequest
2 голосов
/ 08 июля 2010

Я хочу сделать простой вход в систему, выход из системы, а также, разные пользователи имеют разные роли пользователя.Аутентификация Restful, кажется, прекрасно работает, и cancan также очень хорош для контроля пользовательских способностей.Но вопрос в том, как я могу позволить этим двум работать вместе.Я смотрел трансляцию, был ли у меня способ определения способностей пользователя?Нужно ли добавлять столбец «Способности» в пользовательскую таблицу?Спасибо.

http://railscasts.com/episodes/67-restful-authentication

http://railscasts.com/episodes/192-authorization-with-cancan

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Посмотрите на страницу CanCan GitHub: http://github.com/ryanb/cancan

Основываясь на рассмотрении этого и RailsCast, я заметил две вещи:

  1. Вы определяете Способность как отдельную модель. Кажется, что нет необходимых столбцов базы данных.
  2. Вы никоим образом не будете вынуждены выполнять роли, вы можете делать это как угодно.

С помощью restful_authentication просто выполните обычные действия с User моделью.

Самый естественный способ добавить CanCan - добавить дополнительный столбец к вашей модели User с именем role или ability или что-то еще, а затем определить методы по своему усмотрению. Лично я бы, вероятно, использовал какую-то систему счисления, хранящуюся в базе данных, такую ​​как «0» для администратора, «1» для пользователя высокого уровня, «2» для пользователя низкого уровня и т. Д.

Вот несколько возможностей:

# Returns true if User is an admin
def admin?
  self.role == 0
end

И

# Returns true if User is admin and role?(:admin) is called, etc.
def role?(to_match)
  {
    0 => :admin,
    1 => :super_user,
    2 => :user,
    3 => :commenter,
  }[self.role] == to_match
end

Затем в вашем методе Ability initialize вы можете использовать какие-то условные выражения для установки способностей, такие как эти фрагменты из Railscast / readme:

if user.role? :admin
  can :manage, :all
elsif user.role? :super_user
  ...
end

Или:

if user.admin?
  can :manage, :all
else
  ...
end
0 голосов
/ 08 июля 2010

Я написал простое решение, которое работает и с CanCan, просто добавьте столбец role_id: integer в модель User:

# puts this in /lib/
module RolePlay
  module PluginMethods
    def has_roleplay(roles = {})
      @@roles = roles
      @@roles_ids = roles.invert

      def roles
        @@roles
      end

      def find_by_role(role_name, *args)
        find(:all, :conditions => { :role_id => @@roles[role_name]}, *args)
      end

      define_method 'role?' do |r|
        r == @@roles_ids[role_id]
      end

      define_method :role do
        @@roles_ids[role_id]
      end
    end
  end
end

затем включите эту строку в config / initializers / roleplay.rb

ActiveRecord::Base.extend RolePlay::PluginMethods

наконец, используйте его в вашей модели пользователя:

class User < ActiveRecord::Base
  # ...
  has_roleplay(:admin => 0, :teacher => 1, :student => 2)
  # ...
end

теперь ваша модель будет иметь 2 новых метода:

@user.role?(:admin) # true if user has admin role
@user.role # returns role name for the user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...