0

저는 Rails에 익숙하며 Kevin Skoglund가 SHA1 다이제스트를 사용하여 사용자를 인증하는 방법을 보여주는 Lynda.com 자습서를 따라 레일 3에 앱을 개발했습니다. 나는 그것을 애플 리케이션에 사용했고, 이제 몇몇 Authorization을 넣을 필요가있다. 필자가 검색 할 때 CanCan이 레일에서 권한 부여를 위해 더 나은 제품 중 하나임을 알았습니다. 그러나 CanCan은 대부분 사용자 정의 인증이 아닌 Devise 또는 Authlogic 인증을 사용하여 구현되는 것으로 보입니다.레일 3의 사용자 인증과 함께 CanCan 인증을 사용합니다.

  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 

답변

0

먼저 CanCan에 관한 Railscast를 읽거나 보시기 바랍니다.

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을 사용할 수 있어야합니다.

+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