私はRailsを初めて使い、Lynda.comチュートリアルの後に、レール3でアプリケーションを開発しています。ここでKevin SkoglundはSHA1 Digestを使ってユーザーを認証する方法を示しました。私は私のアプリでそれを使用し、今いくつかの認証を入れる必要があります。私が検索したとき、私はCanCanがレールでの認可のためのより良いものの1つであることを発見しました。しかし、CanCanは、主にDevise認証またはAuthlogic認証を使用して実装されており、カスタム認証は使用されていないようです。Rails 3のカスタム認証と一緒にCanCan認証を使用する
- カスタム認証を使用する場合はCanCanを使用することが可能かどうかを知りたかったのです。 CanCanを動作させるにはどうすればいいですか?
- CanCanには 'create_user'が必要ですが、作成する方法や場所はわかりません。
- もう1つの選択肢は、すべてのページで自分のカスタムチェックを入れて、ユーザーの役割を確認し、権限のないページにリダイレクトすることですが、この問題に近づける悪い方法だと思われます。これについての意見をお願いします。
- 追加情報が必要な場合はお知らせください。私は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
ありがとうございました。私はエピソードを見ましたが、それは古いです。 CanCan 1.6のバージョンとそのビデオのバージョンは1.0です。だから、githubサイトで最新情報を確認しました。 [https://github.com/ryanb/cancan]ここで、CanCanはcurrent_userメソッドがコントローラに存在すると予想しています。 – Prashanth
私の答えを編集しました、もっと助かりましたね。 –
素晴らしいです。コードでは、認証が必要な各メソッドでの承認のためにいくつかの行が必要です。 :list、@ user'は動作しますが、あなたのソリューションはうまくいきました。同様のことをしようとしている他の人のメモとして、私はあなたが提案したcurrent_userメソッドを 'ApplicationController'に移さなければなりませんでした。rb 'を各コントローラで宣言するのではなく、私は私のニーズに合わせてこれをカスタマイズする方法を少し探るつもりです。 – Prashanth