`

Rails之用户登录

 
阅读更多

用rails实现一个简单的用户网站登录模块

>rails -v

Rails 3.2.13

首先创建一个用户信息的model,设置表结构如下(包含昵称,加密密码以及salt值)(*_create_users.rb)

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :hashed_password
      t.string :salt

      t.timestamps
    end
  end
end

接着修改model文件如下(model/user.rb):

class User < ActiveRecord::Base

  #配置可访问属性
  attr_accessible :hashed_password, :name, :salt, :password, :password_confirmation
  attr_accessor :password
  
  #数据验证
  validates_presence_of :name
  validates_uniqueness_of :name
  attr_accessor :password_confirmation
  validates_confirmation_of :password
  
  #供controller调用的鉴权函数
  def self.authenticate(name, password)
    user = self.find_by_name(name)
    if user
       expected_password = encrypted_password(password, user.salt)
       if user.hashed_password != expected_password
         user = nil
       end
    end
    user
  end
  
  # 'password' is a virtual attribute
  def password
    @password
  end
  def password=(pwd)
    @password = pwd
    return if pwd.blank?
    create_new_salt
    self.hashed_password = User.encrypted_password(self.password, self.salt)
  end
  
private
  
  #计算密码加密结果
  def create_new_salt
    self.salt = self.object_id.to_s + rand.to_s
  end
  def self.encrypted_password(password, salt)
    string_to_hash = password + "wibble" + salt
    Digest::SHA1.hexdigest(string_to_hash)
  end
end

 创建controller(admin),增加login/logout/register/index等action如下,其中index表示受限资源

class AdminController < ApplicationController

  def register
    if request.post?
		@user = User.new(params[:user])
		if @user.save
		  session[:user_id] = @user.id
		  uri = session[:original_uri]	#跳转到登录之前的页面
	      flash[:notice] = "User #{@user.name} was successfully created."
		  redirect_to(uri || { :action => "index" })
		else
		  redirect_to({ :action => "register" })
		end
	else
	  @user = User.new
	end
  end

  def login
	if request.post?
	  user = User.authenticate(params[:name], params[:password])
	  if user
	    session[:user_id] = user.id
	    uri = session[:original_uri]	#跳转到登录之前的页面
        session[:original_uri] = nil
        redirect_to(uri || { :action => "index" })
	  else
	    flash.now[:notice] = "Invalid user/password combination"
		redirect_to({ :action => "index" })
	  end
    end
  end

  def logout
    session[:user_id] = nil
    flash[:notice] = "Logged out"
    redirect_to(:action => "login" )
  end

  def index
    @user_id = session[:user_id]
  end
end

受限资源内容如下:

<h1>Restricted Resources</h1>
User ID <%= @user_id %>.
<%= link_to 'Logout', :controller => 'admin', :action => 'logout' %>

register的view如下(view/admin/register.html.erb)

<div class="depot-form">
<%= form_for @user, :url => url_for(:controller => 'admin', :action => "register") do |f| %>
  <div class="field">
    <%= f.label :name %>:
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :user_password, 'Password' %>:
    <%= f.password_field :password, :size => 40 %>
  </div>
  <div class="field">
    <%= f.label :user_password_confirmation, 'Confirm' %>:
    <%= f.password_field :password_confirmation, :size => 40 %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
</div>

login的view如下(view/admin/login.html.erb)

<div class="depot-form">
<%= form_tag do %>
<fieldset>
<legend>Please Log In</legend>
<div>
<label for="name">Name:</label>
<%= text_field_tag :name, params[:name] %>
</div>
<div>
<label for="password">Password:</label>
<%= password_field_tag :password, params[:password] %>
</div>
<div>
<%= submit_tag "Login" %>
</div>
</fieldset>
<% end %>

<%= link_to 'Register', :controller => 'admin', :action => 'register' %>
</div>

然后需要配置application_controller.rb,因为所有controller都继承它,在这里可以轻松实现统一的资源限制,我们就不必在每一个controller中单独限制资源了

class ApplicationController < ActionController::Base
  #配置指定action以外都需要进行用户权限验证
  before_filter :authorize, :except => [:login, :register]

  protect_from_forgery
  
protected

  #用户权限验证函数,失败则跳转回登录页面
  def authorize
    unless User.find_by_id(session[:user_id])
	  session[:original_uri] = request.url
      flash[:notice] = "Please log in"
      redirect_to :controller => 'admin' , :action => 'login'
    end
  end
end
分享到:
评论

相关推荐

    关于Rails登录和验证插件http_authentication restful-authentication

    在Rails应用中实现用户登录和验证是构建任何Web服务的基础。本文将深入探讨Rails中的http_authentication和restful-authentication插件,这两种方法都常用于用户身份验证。 首先,让我们了解HTTP基本认证...

    Rails项目源代码

    图片的展示、上传表单、用户登录/注册页面等都会在视图中实现。 7. **控制器逻辑**: 控制器处理HTTP请求,调用模型方法,操作数据,并决定哪个视图应该被渲染。例如,`UsersController`可能有`create`、`show`、`...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    web开发之rails最新调试通过购物车代码

    9. **安全和认证**:"程序登录上的一些问题进行的代码调整"可能指的是添加用户身份验证,确保只有登录用户才能操作自己的购物车。这可能涉及到如Devise这样的认证库。 综上所述,这个压缩包中的代码展示了如何在...

    RailsSpace

    第六章“Logging in and out”着重讲解了用户登录和登出机制的实现。这包括会话管理、Cookies和Sessions的使用等。本章还介绍了如何保护应用免受常见的安全威胁,比如跨站请求伪造(CSRF)攻击。 ##### 3.2 高级登录...

    rails敏捷开发的购物车系统

    这可以通过使用Rails的身份验证机制,如Devise或Authlogic,实现用户登录和会话管理。 最后,测试是任何Rails应用不可或缺的一部分。使用RSpec进行行为驱动开发(BDD)测试,Rake任务自动化测试执行,确保购物车...

    Rails 101S

    - **整合Bootstrap与版型设置**:介绍如何将Bootstrap框架集成到Rails应用中,并设置基础版型,以提升用户体验。 - **深入实践CRUD功能**:详细讲解如何具体实现CRUD操作,包括数据验证、错误处理等高级特性。 - **...

    weixin_rails_middleware, 微信集成 ruby weixin_rails_middleware for integration weixin..zip

    综上所述,`weixin_rails_middleware` 是一款强大且易于使用的工具,能够帮助 Ruby on Rails 开发者无缝集成微信服务,实现各种定制化的微信功能,如自动回复、用户管理、消息推送等。通过深入理解其工作原理和使用...

    rails 项目起步示例

    - **Session** 和 **Cookie**:用于跟踪用户状态,如登录信息。 - **Authentication** 和 **Authorization**:身份验证和授权机制,确保用户安全。 - **Asset Pipeline**:处理和优化应用的静态资源,如JS、CSS的...

    pretender, 在 Rails 中作为另一个用户登录.zip

    当用户登录后,这些信息会被存储,然后在后续请求中用来验证用户身份。然而,如果想以管理员的身份查看并模拟另一个用户的行为,传统的登录方式就无法满足需求。这就是 Pretender 出现的原因。 Pretender 的核心...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    4. **添加认证逻辑**:为了保护敏感数据,可以使用Devise或其他认证插件实现用户登录验证。 5. **测试API**:使用Postman等工具发送请求,测试API是否按预期工作。 通过以上步骤,我们可以构建出一个基本可用的...

    Ruby-Rails实战之B2C商城开发

    在本项目"Ruby-Rails实战之B2C商城开发"中,我们将深入探索使用Ruby on Rails这一强大的Web开发框架来构建一个完整的B2C(Business-to-Consumer)在线商城。Rails是Ruby语言的一个核心框架,以其MVC(Model-View-...

    Ruby on Rails Tutorial Learn Rails by Example 的源代码

    11. **安全**:`sample_app`可能包含了如`devise`这样的身份验证库,展示了如何处理用户注册、登录和授权。 12. **部署**:学习如何将`sample_app`部署到如Heroku这样的云平台,是了解Rails生产环境配置的重要一环...

    Ruby on Rails实现最基本的用户注册和登录功能的教程

    在`SessionsController`中,我们需要实现用户登录的逻辑。 ```ruby # app/controllers/sessions_controller.rb class SessionsController def new end def create @user = User.find_by(username: params[:...

    Rails 3 in Action

    第九章讨论了 **文件上传** 的实现方式,这是 Web 应用中常见的功能之一。 - **文件上传**: - 实现用户可以上传图片、文档等文件的功能。 - 需要考虑安全性问题,防止恶意文件上传。 - 可以使用第三方服务,如 ...

    举例理解Ruby on Rails的页面缓存机制

    在 ChangingThePresent.org 的案例中,由于首页内容根据用户登录状态有所不同,作者采用了“hide-and-seek”策略。即先展示所有用户的公共元素,然后通过 JavaScript 检查 cookie 来决定显示或隐藏特定内容。这样,...

    InspiniaAdmin 2.6.1 Rails_Full_Version

    1. **用户认证与授权**:内置了用户注册、登录、权限管理等功能,可以轻松实现用户身份验证和角色权限控制,确保后台的安全性。 2. **数据可视化**:集成了一系列图表库,如Chart.js和Morris.js,用于数据展示和...

    ruby on rails在线考试系统

    在线考试系统的功能,如用户登录、选择考试、提交答案等,都应有相应的测试覆盖。 7. Gems和插件:Rails社区提供了大量的Gems(Ruby的包管理系统),可以方便地扩展功能。例如,Devise用于用户认证,Cancancan进行...

Global site tag (gtag.js) - Google Analytics