0

私はRailsを初めて使い、Lynda.comチュートリアルの後に、レール3でアプリケーションを開発しています。ここでKevin SkoglundはSHA1 Digestを使ってユーザーを認証する方法を示しました。私は私のアプリでそれを使用し、今いくつかの認証を入れる必要があります。私が検索したとき、私はCanCanがレールでの認可のためのより良いものの1つであることを発見しました。しかし、CanCanは、主にDevise認証またはAuthlogic認証を使用して実装されており、カスタム認証は使用されていないようです。Rails 3のカスタム認証と一緒にCanCan認証を使用する

  1. カスタム認証を使用する場合はCanCanを使用することが可能かどうかを知りたかったのです。 CanCanを動作させるにはどうすればいいですか?
  2. CanCanには 'create_user'が必要ですが、作成する方法や場所はわかりません。
  3. もう1つの選択肢は、すべてのページで自分のカスタムチェックを入れて、ユーザーの役割を確認し、権限のないページにリダイレクトすることですが、この問題に近づける悪い方法だと思われます。これについての意見をお願いします。
  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 

答えて

0

まずCanCanについてRailkeastを読んだり、見たりすることをお勧めします。この宝石の著者によって製造され、したがって、非常に有益されています

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 

その後、あなたは上記のリソースで説明したようにカンカンを使用することができるはずです。

+0

ありがとうございました。私はエピソードを見ましたが、それは古いです。 CanCan 1.6のバージョンとそのビデオのバージョンは1.0です。だから、githubサイトで最新情報を確認しました。 [https://github.com/ryanb/cancan]ここで、CanCanはcurrent_userメソッドがコントローラに存在すると予想しています。 – Prashanth

+0

私の答えを編集しました、もっと助かりましたね。 –

+0

素晴らしいです。コードでは、認証が必要な各メソッドでの承認のためにいくつかの行が必要です。 :list、@ user'は動作しますが、あなたのソリューションはうまくいきました。同様のことをしようとしている他の人のメモとして、私はあなたが提案したcurrent_userメソッドを 'ApplicationController'に移さなければなりませんでした。rb 'を各コントローラで宣言するのではなく、私は私のニーズに合わせてこれをカスタマイズする方法を少し探るつもりです。 – Prashanth