紧接着上一篇文章
http://blog.csdn.net/hexudong08/article/details/7744597
这个项目使用了一个简单的用户认证系统,清爽,不许要devise那么多的功能。很简单。
具体的代码分析如下》
1, 用户注册
非常的简单,就是将数据保存入数据库,然后 sign_in ,关键是sign_in代码。 sign_in代码定义在helper方法里,使用include 入 ApplicationController 中
sessions_helper.rb中定义的方法
将用户的remember_token放到cookies中, 然后给实例变量 @current_user 赋值,很简单。 看看remember_token是如何生成的
user model中的方法如下
值得注意的是, User model中使用了如下的方法
1, 定义一个只读属性 password
2, 定义了另外两个属性 password_confirmation(注册时候需要), password_digest
所以,需要在数据库中定义一个字段, password_digest
如下是他的使用实例
2, 如何认证用户的访问
这样来取得当前用户
http://blog.csdn.net/hexudong08/article/details/7744597
这个项目使用了一个简单的用户认证系统,清爽,不许要devise那么多的功能。很简单。
具体的代码分析如下》
1, 用户注册
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
非常的简单,就是将数据保存入数据库,然后 sign_in ,关键是sign_in代码。 sign_in代码定义在helper方法里,使用include 入 ApplicationController 中
class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
end
sessions_helper.rb中定义的方法
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= user_from_remember_token
end
def current_user?(user)
user == current_user
end
def signed_in?
!current_user.nil?
end
def signed_in_user
unless signed_in?
store_location
redirect_to signin_path, notice: "Please sign in."
end
end
将用户的remember_token放到cookies中, 然后给实例变量 @current_user 赋值,很简单。 看看remember_token是如何生成的
user model中的方法如下
before_save :create_remember_token
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
值得注意的是, User model中使用了如下的方法
has_secure_password
这段代码,有什么作用?这是Rails系统自带的方法,如下是它的源代码
def has_secure_password
# Load bcrypt-ruby only when has_secure_password is used.
# This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library.
gem 'bcrypt-ruby', '~> 3.0.0'
require 'bcrypt'
attr_reader :password
validates_confirmation_of :password
validates_presence_of :password_digest
include InstanceMethodsOnActivation
if respond_to?(:attributes_protected_by_default)
def self.attributes_protected_by_default
super + ['password_digest']
end
end
end
1, 定义一个只读属性 password
2, 定义了另外两个属性 password_confirmation(注册时候需要), password_digest
所以,需要在数据库中定义一个字段, password_digest
如下是他的使用实例
# class User < ActiveRecord::Base
# has_secure_password
# end
#
# user = User.new(:name => "david", :password => "", :password_confirmation => "nomatch")
# user.save # => false, password required
# user.password = "mUc3m00RsqyRe"
# user.save # => false, confirmation doesn't match
# user.password_confirmation = "mUc3m00RsqyRe"
# user.save # => true
# user.authenticate("notright") # => false
# user.authenticate("mUc3m00RsqyRe") # => user
# User.find_by_name("david").try(:authenticate, "notright") # => nil
# User.find_by_name("david").try(:authenticate, "mUc3m00RsqyRe") # => user
2, 如何认证用户的访问
def user_from_remember_token
remember_token = cookies[:remember_token]
User.find_by_remember_token(remember_token) unless remember_token.nil?
end
这样来取得当前用户