0

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

  1. 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?
  2. 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.
  3. 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.
  4. 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 

Antwort

0

Ich empfehle den Railscast über CanCan zuerst zu lesen oder anzuschauen. Es wird von dem Autor dieses Juwel hergestellt und daher sehr informativ:

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

Sie auch Hilfe auf dem Github Seite bekommen:

https://github.com/ryanb/cancan

Irgendwie müssen Sie die zur Zeit holen angemeldeter Benutzer Dies ist, was die current_user Methode tut, und es muss auf dem Benutzer-Controller definiert werden. Probieren Sie etwas wie folgt aus:

class UsersController < ApplicationController 
    # your other actions here 

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

Dann sollten Sie in der Lage sein CanCan zu verwenden, wie oben in den Ressourcen beschrieben.

+0

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

+0

meine Antwort bearbeitet, hoffe, dass es jetzt hilfreicher ist –

+0

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