`
qiezi
  • 浏览: 497156 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[RoR] Login Engine补丁

    博客分类:
  • Ruby
阅读更多

Login Engine是非常好用的一个登录engine,不过也有个缺点,它把用户信息缓存在session里。如果用户每次修改完自己的资料,都把session更新的话,自然是不会有什么数据不同步的问题。不过试想这样一种情况:

1、用户A登录;用户A的信息将保存在session[:user]里。
2、管理员操作用户A,修改用户A的资料并保存。
3、用户A刷新页面。

如果显示用户资料是从session[:user]读取的话,显然用户A看到的是老的资料。

正确的做法是管理员修改用户资料以后,把用户session里的内容也更新,当然这个实施起来有些困难,目前看来无法由用户ID获得对应的session。

有朋友说session里不应该缓存用户信息,而应只保存用户ID。这是正确的,这样可以解决上面的问题,不过带来的问题是每次都要从数据库查询。

如果每次刷新页面都从数据库重新读取用户信息,对性能影响是很大的。试想一下用户正在浏览一个论坛的帖子列表,这个页面可能所有用户看起来都是一样的,唯一不一样的地方是上面用户信息的显示。由于大部分内容都一样,可以使用缓存加快浏览速度。不过却由于session里只保存了用户ID,不得不读取数据库来获得用户信息,这样就把速度又拖慢了。

所以应该把用户信息缓存起来,但要保证它能及时更新。方法自己做一个缓存管理器,能根据用户ID得到用户信息,也能随时更新它。

学着ActionController::Caching做了一个UserManager,它可以根据线程配置来自动开关互斥器:
(/vender/plugins/login_engine/lib/login_engine/user_management.rb)

module UserManagement  # :nodoc:
  class UnthreadedUserManager  # :nodoc:
    def initialize  # :nodoc:
       @users   =  {}
    end
    
    def get(user_id)
      
@users [user_id]
    end
    
    def set(user_id
,  user)
      
@users [user_id]  =  user
    end
  end
  
  module ThreadSafety 
# :nodoc:
    def get(user_id)  # :nodoc:
       @mutex . synchronize { super }
    end
    def set(user_id
,  user)  # :nodoc:
       @mutex . synchronize { super }
    end
  end
  
  class UserManager 
<  UnthreadedUserManager
    def initialize
      super
      
if  ActionController :: Base . allow_concurrency
        
@mutex   =  Mutex . new
        UserManager
. send ( : include ,  ThreadSafety)
      end
    end
  end
  
  @
@user_manager   =  UserManagement :: UserManager . new
  
  def set_current_user(user)
    
return  session[ : user_id]  =  nil  if  user . nil ?
    session[
: user_id]  =  user . id
    cache_user(user)
  end
  
  def current_user
    get_user(session[
: user_id])
  end
  
  def cache_user(user)
    
return   if  user . nil ?
    @
@user_manager . set(user . id ,  user)
  end
  
  def get_user(user_id)
    @
@user_manager . get(user_id)
  end
end  

修改(/verdor/plugins/login_engine/lib/login_engine.rb):

#.
require
 'login_engine/user_management'

module LoginEngine
  include UserManagement
  
#.
end

加入上面加粗的2行。

修改(/verdor/plugins/login_engine/lib/login_engine/authenticated_system.rb),把session[:user]替换为session[:user_id]。

修改(/verdor/plugins/login_engine/app/controllers/user_controller.rb):

  def login
    
return if generate_blank
    
@user = User.new(params[:user])
    
if user = User.authenticate(params[:user][:login], params[:user][:password])
      user
.logged_in_at = Time.now
      user
.save
      set_current_user(user)
      flash[
:notice] = "Login successful"
      redirect_to_stored_or_default 
:action => 'home'
    
else
      
@login = params[:user][:login]
      flash
.now[:warning] = 'Login unsuccessful'
    end
  end

  def logout
    set_current_user(nil)
    redirect_to 
:action => 'login'
  end

  def get_user_to_act_on
    
@user = current_user
  end

简单测试:

require 'login_engine'

class ApplicationController 
< ActionController::Base
  include LoginEngine
  
  helper 
:user
  model 
:user
    
  before_filter 
:login_required
end

class ShowController < ApplicationController
  def show
    render_text "User name: #{current_user.first_name}"
  end
end

class AdminController < ApplicationController
  def edit
    user 
= User.find(params[:id])
    user
.update_attributes(:first_name => params[:name])
    cache_user(user)
    render_text "User name: #{user.first_name}"
  end
end

一个简单的模拟:
1、用户A从IE登录,访问/show/show,将显示用户的名字。
2、管理员从FF登录,访问/show/show,将显示管理员名字。
3、管理员访问/show/show/2?name=hello,其中2是用户A的ID。这将把用户A的名字修改为hello。
4、用户A刷新页面,可以看到显示的用户名字已经发生变化。

以上过程说这个修改已经达到目的。实现这个功能并不难,主要是为了保留Login Engine原有的功能不变。

修改后的代码:
www.cppblog.com/Files/cpunion/login_engine.rar
分享到:
评论
1 楼 qiezi 2006-10-16  
这里的代码做有几个副作用:
1、不支持多进程方式
2、服务器重启则缓存消失

这是初学时写的,现在看来全无必要,等同于自己实现了一个拙劣的session管理器,换了个名字而已。希望没误导人。。。。

因为rails运行的服务器目前只有多进程方式,session管理器也只能寻求进程外的做法,比如数据库、文件、memcached等。本文想要达到的目的也只能通过扩展这些容器来做,有时间再考虑。

相关推荐

    RoR性能优化经验谈

    RoR(Ruby on Rails)是一种流行的开源Web开发框架,以其高效和简洁的代码著称。然而,随着网站规模的增长,性能优化成为必不可少的环节。在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    ror中文资料

    **Ruby on Rails(简称RoR)中文资料** Ruby on Rails(RoR)是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。RoR强调“约定优于配置”...

    神经网络ror resenet模型

    **神经网络Ror ResNet模型详解** 在深度学习领域,ResNet(残差网络)模型是具有里程碑意义的创新,由He et al.在2015年提出。该模型解决了深度神经网络训练中的梯度消失问题,允许构建非常深的网络结构。而“Ror”...

    RoR选题方向—源代码

    Ruby on Rails(RoR)是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程。在这个选题方向中,我们主要探讨的是与RoR相关的源代码分析和学习。源代码是...

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    ror实例

    Ruby on Rails(简称RoR或Rails)是一种基于Ruby语言的开源Web应用框架,它遵循Model-View-Controller(MVC)架构模式,旨在提高开发效率并提供简洁、优雅的代码结构。"ror实例"可能指的是在学习或实践中,通过创建...

    初探ROR

    **初探ROR** Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat ...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    Windows 上搭建 ROR环境

    ### Windows上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...

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

    ROR环境 Ruby version 1.9.3 (java) RubyGems version 1.8.24 Rack version 1.4 Rails version 3.2.12 JavaScript Runtime therubyrhino (Rhino) Active Record version 3.2.12 Action Pack version 3.2.12 ...

    ROR 文件的上传与下载

    ### ROR 文件的上传与下载:深入解析与实践 在Ruby on Rails(简称ROR)框架下,处理文件的上传与下载是一项常见的需求,尤其是在构建包含媒体内容的应用程序时。本文将基于给定的文件信息,详细阐述如何在Rails...

    freemis 基于ror框架的mis

    FreeMIS是一个基于Ruby on Rails(RoR)框架构建的管理信息系统(MIS)。RoR是由David Heinemeier Hansson开发的一个开源Web应用程序框架,它遵循“Don't Repeat Yourself”(DRY)原则,强调简洁和生产力。RoR使用...

    机遇ROR 的图书管理系统

    《机遇ROR的图书管理系统》是一份以Ruby on Rails(简称ROR)技术为核心,旨在构建高效、便捷的图书管理解决方案的学习资料。Ruby on Rails,是基于Ruby编程语言的开源Web应用框架,它遵循MVC(Model-View-...

    RoR 培训课程PPT

    ### RoR培训课程PPT知识点概述 #### 一、课程概览与背景介绍 - **课程性质**:本课程为为期五天的Ruby on Rails(简称RoR)入门级培训,适合初学者快速掌握RoR的基本概念和技术要点。 - **讲师信息**:由Peter ...

    ROR环境配置

    在IT行业中,Ruby on Rails(简称ROR)是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用开发过程,提高开发效率。本文将深入探讨如何配置ROR开发环境,以及...

    javarebel 用JAVA和ROR一样方便测试

    破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar

    ROR介绍演讲课件 ruby on rails

    Ruby on Rails,简称RoR,是由David Heinemeier Hansson基于Ruby语言开发的一款开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性,使得开发者能够更快速地构建功能丰富的web...

    ror留言板程序

    "ror留言板程序"是一个基于Ruby on Rails框架开发的简单应用,它主要用于实现用户在网站上留言和查看他人留言的功能。Ruby on Rails(简称RoR)是用Ruby语言编写的开源Web应用程序框架,遵循MVC(Model-View-...

Global site tag (gtag.js) - Google Analytics