`
qiezi
  • 浏览: 498797 次
  • 性别: 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的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    ROR 文件的上传与下载

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

    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 ...

    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