`

关于rails cookies和session

 
阅读更多

 可以在controller与view中直接通过session与cookies访问,在model中无法访问。

cookie会随着浏览器每次发起的请求(request)传给服务器进行读取,而服务器则会在应答(response)中携带cookie写在本机上。 因此,cookie是存储在本地的。而且由于cookie的这种性质,cookie必须在赋值后的下一次请求中才能“生效”

Session

Ruby代码  
  1. #存信息   
  2. session[:current_user_id ] = user.id  
  3. #取信息   
  4. session[:current_user_id ]  
  5. #删除信息   
  6. session[:current_user_id ] =  nil   
  7. #清空信息   
  8. reset_session  

 

Cookies

cookies操作稍微有点多,因为关系到明文/加密,过期时长
1、默认为关闭浏览器,自动过期;明文存储。

Ruby代码  
  1. #存信息   
  2. cookies[:id ] =  "rubyer.me"   
  3. #取信息   
  4. cookies[:id #输出"rubyer.me"   
  5. #删除信息   
  6. cookies.delete(:key #与session不同   
  7. #清空信息(不能直接删除,置过期即可)   
  8. <% cookies[:id ] = { :expires  => 2.weeks.ago.utc} %>  

 

2、指定2周后过期

Ruby代码  
  1. cookies[ :user_preference ] = {  
  2.   :value  =>  @current_user .preferences,  
  3.   :expires  => 2.weeks.from_now.utc  
  4. }  

 

3、永久存储。实际为20年后过期,非永久

Ruby代码  
  1. cookies.permanent[ :user_preference ] =  @current_user .preferences  

 

相当于
Ruby代码  
  1. cookies[ :user_preference ] = {  
  2.   :value  =>  @current_user .preferences,  
  3.   :expires  => 20.years.from_now.utc  
  4. }  
 4、加密存储,key即为config/initializers/secret_token.rb中的Application.config.secret_token
Ruby代码  
  1. cookies.signed[ :id ] =  "45"   
  2. #存储结果类似   
  3. cookies[:id #返回“BAhJIgc0NQY6BkVU--a07249e5ce4374f62b7af628c70c679caa11c10b”   
  4. #读取值   
  5. cookies.signed[:id #返回"45"   
 

5、加密并永久存储

Ruby代码  
  1. cookies.permanent.signed[ :id ] =  "45"   
  2. cookies.signed[:id

 

思路:表中保存用户的用户名,密码(处理过),密匙,或者把cookies放在特意的一张表中

密码加密是对用户的输入的密码进行md5加密,我做的是md5加密后,再二次用hash加密,密匙是随机生成给用户的随机string,目的是对它进行加密后作为用户的cookie

自动登陆是在本地电脑保存cookie即可,然后读取保存的cookie的值看在数据库中有没有,有的话,就自动登陆,没有的话就跳出登陆框

 

核心代码:

model:

class User < ActiveRecord::Base

# sha1 加密
def self.sha1(pass)
    Digest::SHA1.hexdigest(pass)
end

# md5 加密
def self.md5(pass)
   Digest::MD5.hexdigest(pass)
end

# hash 加密
def self.password_hash(pass)
  Digest::SHA256.hexdigest(pass)
end

# 混合二次加密
def self.mix_password(pass1,pass2)
  password_hash(md5(pass1.to_s).to_s+pass2.to_s)
end

# 随机产生字符串
def self.random_string(len)
    randstring = ""
    chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
    1.upto(len) { |i| randstring << chars[rand(chars.size-1)] }
    return randstring
end

# 向user表中添加记录
def self.create(name,password,pwd_salt)
   @user = User.new do |f|
    f.name = name
    f.password = password
    f.pwd_salt = pwd_salt   
    f.save
  end
end

#判断登陆信息
def self.try_to_login(login_name,login_password)       
        transaction do
          User.find(:first,:conditions=>["name=? and password=?", login_name, login_password])        
end
end # 取得登陆用户的密匙
def self.get_pwdsalt(login_name)
   transaction do
     User.find(:first,:conditions=>["name=?",login_name]).pwd_salt
   end
end

end

controller:

class LoginController < ApplicationController

 

  before_filter :login_from_cookie
def login_from_cookie #自动登陆
# cookies.delete :riskfit_token
  user = Cookieauto.find(:first,:conditions=>["pwd_salt=?",cookies[:riskfit_token]])
  if user && !user.nil?
    render :partial=>'success'
  end
end  

  #向数据库添加记录
  def new
    name = params[:user][:name]
    password = params[:user][:password]
    rand_string = User.random_string(30)
    mix_password = User.mix_password(password,rand_string)
    User.create(name,mix_password ,rand_string)   
  end

  #登陆
  def logon
    name = params[:user][:name]
    password = params[:user][:password]
    pwd_salt = User.get_pwdsalt(name)
    mix_password = User.mix_password(password,pwd_salt)
    login_user = User.try_to_login(name,mix_password) 
    if params[:auto]
      Cookieauto.create(name, pwd_salt)
      cookies[:riskfit_token]={:value=>pwd_salt,:expires => Time.now + 7.days}
    end    
    if !login_user.nil?
      render :partial => 'success'
      puts "render"
    end
  end

  #method:logout
  def logout
    cookies.delete :riskfit_token
    render :action=>'index'
  end

end

 

sql:


DROP TABLE IF EXISTS `cookieautos`;
CREATE TABLE `cookieautos` (
  `id` int(20) NOT NULL auto_increment,
  `name` varchar(30) default NULL,
  `pwd_salt` varchar(128) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(30) default NULL,
  `password` text,
  `pwd_salt` varchar(128) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

source:

http://www.namipan.com/d/87f7886a3c0660304c48d2b03385810c084ddb7aabbf0100

 

来自:http://www.blogjava.net/fl1429/archive/2009/03/26/262191.html

 

分享到:
评论

相关推荐

    Rails api 英文版

    此外,还包含关于响应格式化、cookies和session管理的内容。 4. **路由(Routes)**:Rails的路由系统将URL映射到控制器的动作上。通过阅读文档,你可以学习如何配置路由,设置资源、命名路径以及使用约束和条件。 ...

    Ruby-RailsFootnotes在每一个Rails页脚展示应用程序的相关信息方便调试

    1. ** Sessions 显示**:在开发过程中,Session数据往往承载着用户状态和会话信息,查看这些数据有助于理解用户行为和应用逻辑。 2. ** 请求参数**:Rails Footnotes能够展示HTTP请求的所有参数,包括GET和POST数据...

    ruby on rails 教程

    文档还触及了更高级的主题,如Session和Cookies的管理,这是Web开发中处理用户状态和数据持久化的重要方面: - **Session**:讲解了Session的概念、存储方式及管理策略,包括如何将模型实例存储在Session中,以及...

    plug_rails_cookie_session_store:与Rails兼容的插件会话存储

    总的来说,`plug_rails_cookie_session_store`是一个帮助Elixir Phoenix应用实现与Rails兼容的会话存储解决方案,方便在Rails和Phoenix之间进行迁移或整合项目,同时确保会话管理的一致性。通过使用这个插件,开发者...

    Ruby on Rails 3.2 Tutorial

    7. **会话和cookies**:讲解如何使用Rails的session和cookie机制来管理用户状态。 8. **表单和链接**:介绍如何创建HTML表单以及使用Rails的辅助方法创建链接,实现用户交互。 9. **部署**:讲解如何将应用程序...

    使用 rails进行敏捷开发(第三版)

    11. **会话与cookies**:讨论用户认证和会话管理,包括session和cookie的使用。 12. **部署与配置**:讲解如何将Rails应用部署到服务器,如Heroku或AWS,并进行生产环境的配置。 13. **安全与最佳实践**:涵盖CSRF...

    session_backend

    默认情况下,Rails将session数据存储在cookies中,但也可以配置为使用其他后端,如数据库或内存中的缓存,这就是"session_backend"这个名字的由来。 项目可能包含以下关键组件: 1. **Models**:代表数据库中的表和...

    sample_app:Michael Hartl 的 Rails 教程第 3 版中的“sample_app”

    通过学习这部分,你可以了解如何安全地存储和验证用户的凭证,以及如何利用cookies和session来跟踪用户状态。 错误处理和测试是确保应用稳定性和健壮性的关键。sample_app包含了测试驱动开发(TDD)的例子,使用...

    Rails_friends

    6. **会话(Session)和cookies**:用于维持用户状态,如登录信息,Rails提供内置支持。 7. **身份验证和授权**:可能使用如Devise这样的gem进行用户认证,而CanCanCan或Pundit用于权限管理。 8. **测试**:Rails...

    cookie:用 ruby​​ 实现的 HTTP Cookie

    Ruby的`ActionDispatch::Cookies`模块在Rails中提供了这样的保护,例如,它会自动为每个Cookie添加安全和HttpOnly标志,防止JavaScript访问。 在解压的文件"cookie-master"中,可能包含了示例代码或教程,帮助你更...

    node-cookie-derail:解码并可选择验证未加密的 Ruby on Rails cookie 的签名

    饼干出轨 解码并可选择验证未加密的 Ruby on Rails cookie 的签名。 对此的替代实现要求您... _app_session ; 解码一个 cookie,使用 Rails 应用程序的秘密令牌验证它没有被篡改: var value = derail . decode ( req

    scotty-session:向 scotty 添加会话功能

    会话管理允许Web应用在不同的HTTP请求之间存储和检索数据,而无需将这些信息包含在URL中或者通过cookies传递。这在处理登录状态、购物车或其他需要临时存储用户信息的情况下尤其有用。使用"scotty-session",开发者...

    ROR绿色最新环境(2013/3/10)

    ActionDispatch::Session::CookieStore ActionDispatch::Flash ActionDispatch::ParamsParser ActionDispatch::Head Rack::ConditionalGet Rack::ETag ActionDispatch::BestStandardsSupport Application root C:/...

    cookies_and_sessions_lab-v-000

    介绍Rails session方法使我们可以访问Rails会话。 会话是使用Cookie实现的数据存储。 您可以在会话中存储简单的数据结构。 ActiveRecord模型,否。 字符串或数字数组,是的。 基本上,坚持使用数据文字-数字,字符串...

    cookies_and_sessions_lab-seattle-web-091619

    介绍Rails session方法使我们可以访问Rails会话。 会话是使用Cookie实现的数据存储。 您可以在会话中存储简单的数据结构。 ActiveRecord模型,否。 字符串或数字数组,是的。 基本上,坚持使用数据文字-数字,字符串...

    devise_token_auth_demo:这是一个用于为 Rails JSON API 设计令牌身份验证的小型演示应用程序

    在JSON API中,传统的session-based身份验证不适用,因为API通常不依赖于cookies。相反,`devise_token_auth` 使用访问令牌进行身份验证。每次用户成功登录后,服务器会生成一对唯一且不可预测的令牌(access_token...

    cookies-intro

    因此,在设计Web应用时,需要谨慎使用Cookie,并考虑使用更安全的存储机制,如Session或LocalStorage。 总的来说,Cookie是构建Web应用不可或缺的一部分,尤其在用户身份验证和个性化体验方面。理解如何在Ruby这样...

    trackable

    Rails框架内置了session支持,开发者可以方便地设置和获取session数据。 2. **ActiveRecord**:这是Ruby on Rails框架的一部分,用于数据库操作。在trackable功能中,可能需要创建UserActivity或类似的模型来存储...

    网络服务器模块.rar

    - **会话管理**:保持用户会话状态,如使用cookies和session。 - **错误处理**:捕获并处理可能出现的错误,如404 Not Found、500 Internal Server Error等。 3. **常用网络服务器模块** - **Node.js**:使用V8...

    毕业设计:在线学习系统.zip

    7. **学习进度追踪**:通过cookies或session追踪用户的学习进度,以便为用户提供个性化推荐和学习建议。 8. **API集成**:可能与其他服务(如支付网关、邮件服务)通过API进行集成,实现支付功能和通知服务。 9. *...

Global site tag (gtag.js) - Google Analytics