Ich bin neu bei Rails und habe eine App in Rails 3 entwickelt, nachdem ich einem Lynda.com-Tutorial gefolgt war, bei dem Kevin Skoglund uns einen Weg zur Authentifizierung eines Benutzers mit SHA1 Digest zeigte. Ich habe das in meiner App benutzt und jetzt muss ich eine Autorisierung einreichen. Als ich herumgesucht habe, war CanCan einer der besseren für die Zulassung in Schienen. CanCan scheint jedoch größtenteils mit der Devise- oder Authlogic-Authentifizierung und nicht mit der benutzerdefinierten Authentifizierung implementiert zu werden.CanCan Authorization zusammen mit Custom Authentication in Rails 3 verwenden
- Ich wollte wissen, ob es überhaupt möglich ist, CanCan zu verwenden, wenn wir benutzerdefinierte Authentifizierung verwenden, wie ich es getan habe. Wie kann man CanCan zur Arbeit bringen?
- Es sieht so aus, als ob CanCan 'create_user' benötigt, um anwesend zu sein, aber ich bin mir nicht sicher, wie/wo ich es erstellen soll.
- Eine andere Alternative, die ich dachte, würde sein, meine benutzerdefinierte Überprüfung auf jeder Seite zu setzen, um die Benutzerrolle zu überprüfen und sie auf eine Fehlerseite umzuleiten, wenn sie nicht autorisiert sind, aber das scheint ein schlechter Weg, dieses Problem anzugehen ... Ihr Ansichten dazu bitte.
- Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Ich benutze Ruby 1.9.3 und Rails 3.2.1.
Unten ist die Art, wie ich meine aktuelle Authentifizierung eingerichtet habe. Jede Hilfe würde sehr geschätzt werden.
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 (User Modell)
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
danke. Ich habe die Folge gesehen, aber es ist alt. Wir haben jetzt CanCan 1.6 Version und die Version, der das Video folgt, ist ungefähr 1.0. Also habe ich auf der github-Seite nach den neuesten Informationen gefragt. [https://github.com/ryanb/cancan] Dort wird angegeben, dass CanCan erwartet, dass eine current_user-Methode im Controller vorhanden ist. – Prashanth
meine Antwort bearbeitet, hoffe, dass es jetzt hilfreicher ist –
Großartig. Der Code benötigt einige zusätzliche Zeilen für die Autorisierung in jeder Methode, die eine Autorisierung benötigt - "authorize! : list, @ user', um zu arbeiten, aber Ihre Lösung hat funktioniert ... Als Hinweis für andere, die etwas Ähnliches tun wollten, musste ich die von Ihnen vorgeschlagene current_user-Methode in 'ApplicationController' verschieben.rb 'anstatt es in jedem Controller zu deklarieren. Ich werde ein wenig darüber nachdenken, wie ich dies für meine Bedürfnisse anpassen kann. – Prashanth