Rails一个小项目的研究笔记

4 篇文章 0 订阅
2 篇文章 0 订阅
紧接着上一篇文章
http://blog.csdn.net/hexudong08/article/details/7744597


如何实现一个简单的认证系统,不用devise?

这个项目使用了一个简单的用户认证系统,清爽,不许要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

这样来取得当前用户


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值