用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应用中实现用户登录和验证是构建任何Web服务的基础。本文将深入探讨Rails中的http_authentication和restful-authentication插件,这两种方法都常用于用户身份验证。 首先,让我们了解HTTP基本认证...
图片的展示、上传表单、用户登录/注册页面等都会在视图中实现。 7. **控制器逻辑**: 控制器处理HTTP请求,调用模型方法,操作数据,并决定哪个视图应该被渲染。例如,`UsersController`可能有`create`、`show`、`...
### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...
9. **安全和认证**:"程序登录上的一些问题进行的代码调整"可能指的是添加用户身份验证,确保只有登录用户才能操作自己的购物车。这可能涉及到如Devise这样的认证库。 综上所述,这个压缩包中的代码展示了如何在...
第六章“Logging in and out”着重讲解了用户登录和登出机制的实现。这包括会话管理、Cookies和Sessions的使用等。本章还介绍了如何保护应用免受常见的安全威胁,比如跨站请求伪造(CSRF)攻击。 ##### 3.2 高级登录...
这可以通过使用Rails的身份验证机制,如Devise或Authlogic,实现用户登录和会话管理。 最后,测试是任何Rails应用不可或缺的一部分。使用RSpec进行行为驱动开发(BDD)测试,Rake任务自动化测试执行,确保购物车...
- **整合Bootstrap与版型设置**:介绍如何将Bootstrap框架集成到Rails应用中,并设置基础版型,以提升用户体验。 - **深入实践CRUD功能**:详细讲解如何具体实现CRUD操作,包括数据验证、错误处理等高级特性。 - **...
综上所述,`weixin_rails_middleware` 是一款强大且易于使用的工具,能够帮助 Ruby on Rails 开发者无缝集成微信服务,实现各种定制化的微信功能,如自动回复、用户管理、消息推送等。通过深入理解其工作原理和使用...
- **Session** 和 **Cookie**:用于跟踪用户状态,如登录信息。 - **Authentication** 和 **Authorization**:身份验证和授权机制,确保用户安全。 - **Asset Pipeline**:处理和优化应用的静态资源,如JS、CSS的...
当用户登录后,这些信息会被存储,然后在后续请求中用来验证用户身份。然而,如果想以管理员的身份查看并模拟另一个用户的行为,传统的登录方式就无法满足需求。这就是 Pretender 出现的原因。 Pretender 的核心...
4. **添加认证逻辑**:为了保护敏感数据,可以使用Devise或其他认证插件实现用户登录验证。 5. **测试API**:使用Postman等工具发送请求,测试API是否按预期工作。 通过以上步骤,我们可以构建出一个基本可用的...
在本项目"Ruby-Rails实战之B2C商城开发"中,我们将深入探索使用Ruby on Rails这一强大的Web开发框架来构建一个完整的B2C(Business-to-Consumer)在线商城。Rails是Ruby语言的一个核心框架,以其MVC(Model-View-...
11. **安全**:`sample_app`可能包含了如`devise`这样的身份验证库,展示了如何处理用户注册、登录和授权。 12. **部署**:学习如何将`sample_app`部署到如Heroku这样的云平台,是了解Rails生产环境配置的重要一环...
在`SessionsController`中,我们需要实现用户登录的逻辑。 ```ruby # app/controllers/sessions_controller.rb class SessionsController def new end def create @user = User.find_by(username: params[:...
第九章讨论了 **文件上传** 的实现方式,这是 Web 应用中常见的功能之一。 - **文件上传**: - 实现用户可以上传图片、文档等文件的功能。 - 需要考虑安全性问题,防止恶意文件上传。 - 可以使用第三方服务,如 ...
在 ChangingThePresent.org 的案例中,由于首页内容根据用户登录状态有所不同,作者采用了“hide-and-seek”策略。即先展示所有用户的公共元素,然后通过 JavaScript 检查 cookie 来决定显示或隐藏特定内容。这样,...
1. **用户认证与授权**:内置了用户注册、登录、权限管理等功能,可以轻松实现用户身份验证和角色权限控制,确保后台的安全性。 2. **数据可视化**:集成了一系列图表库,如Chart.js和Morris.js,用于数据展示和...
在线考试系统的功能,如用户登录、选择考试、提交答案等,都应有相应的测试覆盖。 7. Gems和插件:Rails社区提供了大量的Gems(Ruby的包管理系统),可以方便地扩展功能。例如,Devise用于用户认证,Cancancan进行...