Используйте CanCan Authorization вместе с пользовательской аутентификацией в Rails 3 - PullRequest
0 голосов
/ 26 марта 2012

Я новичок в Rails и занимаюсь разработкой приложения в rails 3 после того, как прочитал учебное пособие на Lynda.com, где Кевин Скоглунд показал нам способ аутентификации пользователя с помощью SHA1 Digest. Я использовал это в своем приложении, и теперь необходимо добавить авторизацию. Когда я искал вокруг, я обнаружил, что CanCan был одним из лучших для авторизации в рельсах. Однако CanCan, по-видимому, в основном реализован с использованием аутентификации Devise или Authlogic, а не пользовательской аутентификации.

  1. Я хотел знать, возможно ли вообще использовать CanCan, если мы используем пользовательскую аутентификацию, как я сделал. Так, как заставить CanCan работать?
  2. Похоже, что CanCan нужен какой-то 'create_user', но я не уверен, как / где его создать.
  3. Еще одна альтернатива, которую я подумал, заключалась бы в том, чтобы поставить свою собственную проверку на каждой странице, чтобы проверить роль пользователя и перенаправить их на страницу с ошибкой, если они не авторизованы, но это кажется плохим способом решения этой проблемы ... Ваш взгляды на это пожалуйста.
  4. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Я использую Ruby 1.9.3 и Rails 3.2.1.

Ниже описан способ настройки текущей аутентификации. Любая помощь будет принята с благодарностью.

access_controller.rb

class AccessController < ApplicationController
  before_filter :confirm_logged_in, :except => [:login, :attempt_login, :logout]

  def attempt_login
    authorized_user = User.authenticate(params[:username], params[:password])
    if authorized_user
      session[:user_id] = authorized_user.id
      flash[:notice] = "You are logged in"
      redirect_to(:controller => 'orders', :action => 'list')
    else
      flash[:notice] = "Invalid Username/password combination"
      redirect_to(:action => 'login')
    end
  end

  def logout
    session[:user_id] = nil
    flash[:notice] = "You have been logged out"
    redirect_to(:action => 'login')
  end
end

user.rb (модель пользователя)

require 'digest/sha1'

    class User < ActiveRecord::Base
      has_one :profile
      has_many :user_roles
      has_many :roles, :through => :user_roles

      attr_accessor :password
      attr_protected :hashed_password, :salt

      def self.authenticate(username="", password="")
        user = User.find_by_username(username)
        if user && user.password_match(password)
          return user
        else
          return false
        end
      end

      def password_match(password="")
        hashed_password == User.hash_with_salt(password, salt)
      end

      validates_length_of :password, :within => 4..25, :on => :create
      before_save :create_hashed_password
      after_save :clear_password

      def self.make_salt(username="")
        Digest::SHA1.hexdigest("Use #{username} with #{Time.now} to make salt")
      end

      def self.hash_with_salt(password="", salt="")
        Digest::SHA1.hexdigest("Put #{salt} on the #{password}" )
      end

      private
      def create_hashed_password
        unless password.blank?
          self.salt = User.make_salt(username) if salt.blank?
          self.hashed_password = User.hash_with_salt(password, salt)
        end
      end

      def clear_password
        self.password = nil
      end
    end

ApplicationController.rb

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

  def confirm_logged_in
    unless session[:user_id]
      flash[:notice] = "Please Log In"
      redirect_to(:controller => 'access', :action => 'login')
      return false
    else
      return true
    end
  end
end

1 Ответ

0 голосов
/ 26 марта 2012

Я рекомендую сначала прочитать или посмотреть Railscast о CanCan.Он создан автором этого драгоценного камня и поэтому очень информативен:

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

Вы также можете получить помощь на странице Github:

https://github.com/ryanb/cancan

Каким-то образом вам нужно выбрать текущего вошедшего в систему пользователя.Это то, что делает метод current_user, и его нужно определить на контроллере пользователя.Попробуйте что-то вроде этого:

class UsersController < ApplicationController
  # your other actions here

  def current_user
    User.find(session[:user_id])
  end
end

Тогда вы сможете использовать CanCan, как описано в ресурсах выше.

...