저는 Rails에 익숙하며 Kevin Skoglund가 SHA1 다이제스트를 사용하여 사용자를 인증하는 방법을 보여주는 Lynda.com 자습서를 따라 레일 3에 앱을 개발했습니다. 나는 그것을 애플 리케이션에 사용했고, 이제 몇몇 Authorization을 넣을 필요가있다. 필자가 검색 할 때 CanCan이 레일에서 권한 부여를 위해 더 나은 제품 중 하나임을 알았습니다. 그러나 CanCan은 대부분 사용자 정의 인증이 아닌 Devise 또는 Authlogic 인증을 사용하여 구현되는 것으로 보입니다.레일 3의 사용자 인증과 함께 CanCan 인증을 사용합니다.
- 필자는 사용자 인증을 사용하는 경우 CanCan을 사용하는 것이 가능한지 알고 싶었습니다. CanCan이 작동하도록하는 방법은 무엇입니까?
- CanCan에 'create_user'가 필요하지만 어떻게 만들지 모르겠다.
- 내가 생각하는 또 다른 대안은 모든 페이지에서 사용자 역할을 확인하고 권한이없는 경우 오류 페이지로 리디렉션하는 것이지만이 문제에 접근하는 나쁜 방법 인 것 같습니다. 이것에 대한 견해들.
- 추가 정보가 필요하면 알려주십시오. 나는 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