用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
相关推荐
Ajax、Prototype和Scriptaculous等JavaScript代码库和RJS,Session管理、用户登录和认证系统,XML和ActiveResource,后台处理和ActionMaile,测试和specs(包括RSpec on Rails和Selenium),安装、管理、编写插件,...
里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下
pretender, 在 Rails 中作为另一个用户登录 作为管理员,有时你想知道另一个用户看到了什么。 满足Pretender者。轻松地在用户之间进行 switch最小代码更改审核工具配合使用
具有Facebook登录功能的用户和管理系统。 它对Heroku不可安装。 该视图是使用实现的。 这是。 请注意,未设置用于Facebook登录的环境变量,因此以这种方式登录将不起作用。宝石文件PostgreSQL用于使用 for Facebook...
该插件向 Rails Admin 仪表板添加了一个自定义操作,以便以用户身份从您的应用程序登录,而无需知道他们的密码。 此插件仅适用于使用模型类。 安装 要启用 rails_admin_become_user,请将以下内容添加到您的...
Google登入Rails 这个gem可让您将Google登录信息添加到您的Rails应用中。 您可以让用户使用其Google帐户注册并登录到您的服务。安装将google_sign_in添加到您的Rails应用的Gemfile并运行bundle install : gem '...
11.1 迭代F1:添加用户 113 11.2 迭代F2:登录 120 11.3 迭代F3:访问控制 122 11.4 迭代F4:添加边栏,以及更多的管理功能 124 第12章 任务G:最后一片饼干 129 12.1 生成XML 129 12.2 扫尾工作 136 第13章 任务I:...
MTDevise Rails 5.1多租户引擎文档 PHC MTDevise Rails 5.1引擎为Rails Devise gem添加了多租户和帐户... 所有租户(用户)或通过子域登录的中央登录屏幕。 拼写错误,如果子域不存在,则重定向到欢迎屏幕。 与postgr
rails语言api项目 使用grape和swagger的简单api项目 使用devise做简易的用户登录需求,使用capistrano部署
有一个用户示例可供使用,该示例使用电子邮件user@example.com和密码123456789登录。 主页。 登录页面。 仪表板页面。 原作者 伊万·冈萨雷斯( IvánGonzález),又名 定期开发环境设置 要开始使用此模板,您...
rails2.0的内容管理系统,可以发布文档、CVS库和Web资源3中资源,其中文档可以上传下载附件。支持打Tag。用户注册登录使用restful_authentication,分页使用will_paginate,Gem版本1.3.5
它还将创建一个管理员和一个普通用户供您登录。 该用户的凭据为: 管理员用户username: admin@example.compassword: changeme普通用户username: user@example.compassword: changeme如果要运行
OpenWISP用户管理系统(OWUMS)是Ruby on Rails应用程序,能够管理wISP的用户群。 OWUMS支持以下功能: 通过手机,ID卡,信用卡进行用户注册-Banca Sella Gestpay-完全符合意大利法律。 用户界面支持常见的...
使用Starburst,您可以在Rails应用程序中向登录用户显示消息。 用户关闭该消息后,将不会再看到它。 您可以根据用户的数据库属性或User类上您自己的方法,将消息定向到特定的User组。 例如,您可能只向高级计划中...
Expense归属用户数,UserExpense归属用户数和belongs_to支出入门: 克隆存储库设置后端cd进入后端文件夹捆绑宝石bundle install运行迁移以构建表rails db:migrate种子数据库,因此您可以以测试用户身份登录rails db:...
Devise是基于Warden的Rails灵活的身份验证解决方案。 它:基于机架;...它由10个模块组成:数据库可身份验证:哈希并在登录数据库中存储密码以验证用户的真实性。身份验证可以通过POST请求或HTTP Basi进行。
一旦用户登录或注册,该策略将永久保留新政策的版本控制系统JSON终结点可处理待处理的策略和可移植性逻辑,以便在仅客户端的接口中实现,即:您将其命名为诸如React,Vue,Backbone之类的前端应用程序。可移植性可...