Используйте CanCan Authorization вместе с пользовательской аутентификацией в Rails 3
Я новичок в Rails и занимаюсь разработкой приложения в rails 3 после того, как следую учебному пособию на Lynda.com, где Кевин Скоглунд показал нам способ аутентификации пользователя с помощью SHA1 Digest. Я использовал это в своем приложении, и теперь необходимо добавить авторизацию. Когда я искал вокруг, я обнаружил, что CanCan был одним из лучших для авторизации в рельсах. Однако CanCan, по-видимому, в основном реализован с использованием аутентификации Devise или Authlogic, а не пользовательской аутентификации.
- Я хотел знать, возможно ли вообще использовать 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
1 ответ
Я рекомендую сначала прочитать или посмотреть Railscast о CanCan. Это сделано автором этого драгоценного камня и поэтому очень информативно:
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, как описано в ресурсах выше.