使用ruby on rails的好处之一就是有很多功能可以不用自己来实现,有很多开源的组件可以直接拿来用,达到项目的目的。

比如登陆安全验证,要让自己来写需要考虑很多:

1. session生命周期

2. 密码加密

3. 注册邮箱验证

等等。。。

此外还有各种麻烦的model操作,sign in, sign out, register, modify password, etc....

由于这部分业务逻辑相当统一,所以使用一个模板来搞定是很省事的,而ROR的一大优势就在于各种社区相当活跃,像用户验证这种应用广泛的组件也能找到很多,这里就采用了一个很成熟、功能强大的devise引擎来做介绍,注意rails版本最低得3.2。Github主页——https://github.com/plataformatec/devise

一、安装Devise

首先安装,在项目的Gemfile中,加上

gem 'devise'

接下来回到命令行,安装该Gem

bundle install

这样devise就安装好了,接下来就是将devise添加到项目中去

rails generate devise:install

如果在用户验证功能里需要用到邮件验证,则需要把下面的代码加到config/environments/development.rb 和 production.rb中

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

另外在app/views/layouts/application.html.erb里可以加上下面的代码,用于显示登录过程中的各种警告信息

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

最后,还需要在路由文件添加root action并且添加view,这个root action就是登录成功后跳转的页面,比如可以这样添加

root 'welcome#index'

默认登录成功后进入welcome控制器下的index.html.erb这个view,当然可以需要按照具体情况修改

二、添加Model
既然作为用户验证,肯定组要验证的ID和Password,所以需要建立Model,使用devise来建立model,并且迁移数据库:

rails g devise user
rake db:migrate

这样一个默认的用户Model就建立起来了,然后添加模板

rails generate devise:views

devise会自动在view路径下添加用户验证所需要的各种view模板

下面做一些测试工作,在app/view/welcom/index.html.erb中写入如下代码:

<h1>Log In</h1>
<% if user_signed_in? %>hello, <%= current_user.username %>! You are <%= current_user.role %><%= link_to('登出', destroy_user_session_path, :method => :delete) %>
<% else %><%= link_to('注册', new_registration_path(:user)) %><%= link_to('登录', new_session_path(:user)) %>
<% end %>

完成后可以使用rails server打开服务器,在浏览器输入http://localhost:3000/users/sign_in

可以看到一个功能完整的登录页面,并且有注册的链接,注册一个账户可以实现登录等功能,并且能够保持session会话。同时无论是wareshark抓包还是进入数据库,可以看到账户的密码都是加密的,安全性很好

当然这里可以发现登录的ID是邮件,很多时候我们用到的还是一个用户名而不是邮件,所以这里当然可以改成username。

首先给Model添加用户名属性,并且迁移数据库

rails generate migration add_username_to_users username:string:uniq
rake db:migrate

这样就成功将username属性添加到数据库中,并且设置为唯一。然后修改config/initializers/devise.rb文件,找到config.authentication_keys = [ :email ]这一行,改为下面这样:

config.authentication_keys = [ :username ]

由于username是新添加的属性,所以由于Rails健壮参数机制,还需要修改application_controller.rb文件,按照下面的格式修改:

class ApplicationController < ActionController::Basebefore_action :configure_permitted_parameters, if: :devise_controller?protecteddef configure_permitted_parametersdevise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :password, :password_confirmation, :remember_me) }devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :password, :remember_me) }devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :password, :password_confirmation, :current_password) }end
end

然后修改views文件,把Email改为Username,比如sessions/new.html.erb可以这样改:

-  <p><%= f.label :email %><br />
-  <%= f.email_field :email %></p>
+  <p><%= f.label :login %><br />
+  <%= f.text_field :login %></p>

最后也是最重要的一步,如果出现email can't be blank的错误提示时,需要在app/models/user.rb里添加如下代码

protecteddef email_required?falseend

顾名思义就是不再需要email验证,但是这里还会有一个问题,那就是虽然不验证email了,但是如果在注册第二个账户的时候,会出现注册失败的情况,那就是因为在初始建表的时候,email被设置为unique,而email默认为“”,会导致注册第二个账户时因为email也是“”导致报错。所以还需要将email的index取消掉,取消需要写一个新的迁移文件

rails g migration remove_index

然后进入db/migrate可以找到新生城的文件,改为如下代码:

class RemoveIndex < ActiveRecord::Migrationdef changeremove_index :users, :column => :emailend
end

然后只需rake db:migrate迁移数据库,这样应该就可以完成了。可以再次用浏览器验证一下

三、使用bootstrap风格的Devise

前面实现的用户验证界面还是挺简陋的,所以这里还是使用比较流行bootstrap前端框架美化一下

首先安装twitter-bootstrap-rails,我安装的是功能更加丰富的LESS样式,在Gemfile文件种添加依赖

gem "therubyracer"
gem "less-rails" #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
gem "twitter-bootstrap-rails"
然后bundle install安装文件并且生成bootstrap然后添加到assets中
bundle install
rails generate bootstrap:install less

接下来将app/assets/stylesheets/bootstrap_and_overrides.css.less文件,改为下面这样:

// Core variables and mixins
@import "twitter/bootstrap/variables.less";
@import "twitter/bootstrap/mixins.less";// Reset and dependencies
@import "twitter/bootstrap/normalize.less";
@import "twitter/bootstrap/print.less";
//@import "twitter/bootstrap/glyphicons.less"; // Excludes glyphicons// Core CSS
@import "twitter/bootstrap/scaffolding.less";
@import "twitter/bootstrap/type.less";
@import "twitter/bootstrap/code.less";
@import "twitter/bootstrap/grid.less";
@import "twitter/bootstrap/tables.less";
@import "twitter/bootstrap/forms.less";
@import "twitter/bootstrap/buttons.less";// Components
@import "twitter/bootstrap/component-animations.less";
@import "twitter/bootstrap/dropdowns.less";
@import "twitter/bootstrap/button-groups.less";
@import "twitter/bootstrap/input-groups.less";
@import "twitter/bootstrap/navs.less";
@import "twitter/bootstrap/navbar.less";
@import "twitter/bootstrap/breadcrumbs.less";
@import "twitter/bootstrap/pagination.less";
@import "twitter/bootstrap/pager.less";
@import "twitter/bootstrap/labels.less";
@import "twitter/bootstrap/badges.less";
@import "twitter/bootstrap/jumbotron.less";
@import "twitter/bootstrap/thumbnails.less";
@import "twitter/bootstrap/alerts.less";
@import "twitter/bootstrap/progress-bars.less";
@import "twitter/bootstrap/media.less";
@import "twitter/bootstrap/list-group.less";
@import "twitter/bootstrap/panels.less";
@import "twitter/bootstrap/responsive-embed.less";
@import "twitter/bootstrap/wells.less";
@import "twitter/bootstrap/close.less";// Components w/ JavaScript
@import "twitter/bootstrap/modals.less";
@import "twitter/bootstrap/tooltip.less";
@import "twitter/bootstrap/popovers.less";
@import "twitter/bootstrap/carousel.less";// Utility classes
@import "twitter/bootstrap/utilities.less";
@import "twitter/bootstrap/responsive-utilities.less";

然后再把application.css文件名改为application.css.less,进入该文件并且添加:

/**= require bootstrap_and_overrides*/

这样就成功将bootstrap安装到rails项目中去,接下来再安装devise-bootstrap-views,这是一个将devise和bootstrap结合的views模板,安装方法和前面一样,在Gemfile里添加

gem 'devise-bootstrap-views'

然后bundle install,接下来生成模板,注意这里生成的模板可能会覆盖之前的views模板!!!!

rails g devise:views:bootstrap_templates

最后生成定制后的提示替换文件:

rails g devise:views:locale it

这样一来,就大功告成了,可以看一下最终的页面了


样式和官方给的不太一样,下次有时间再研究研究

rails使用devise验证相关推荐

  1. Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系

    devise.cancan和rolify这三个组件结合,可以建立完整而强大的用户权限模型. devise介绍,负责用户注册.登录.退出.找回密码等操作.细节参考devise on github can ...

  2. rails集成devise

    devise是基于Warden的rails灵活的身份验证方案: 添加gem,在Gemfile中添加 gem 'devise' #添加后命令:bundle install 运行生成器 $ rails g ...

  3. rails gem devise

    1:在Gemfile中添加 gem 'devise' 2:  执行bundle install  之后  将devise添加到项目中去 rails g devise:instal 会创建以下文件: c ...

  4. rails gem devise 整死我算了

    devise - 你做了好多,我确不懂你.甚至理解你都那么困难. 转载于:https://www.cnblogs.com/laoquans/p/3906124.html

  5. Rails中的使用者验证:Devise

    Rails中的使用者验证:Devise 概要:Devise是Ruby On Rails的一个三方权限认证组件,通过它可以无需编码快速生成一个带有登陆,注册.权限认证和重置密码的认证模块. 安装: 1. ...

  6. Rails图像上传:使用CarrierWave和Devise

    在本系列的第一部分中,您学习了如何在Rails应用程序中使用CarrierWave. 在第二部分中,您将学习如何使用Devise为用户启用图像上传. Devise是Rails的身份验证解决方案. 您还 ...

  7. rails + devise 用户注册登录及权限判断

    Mac环境 macOS High Sierra 版本 10.13.1 ruby 2.4.1p111 Rails 5.1.4 编辑软件:Atom(你可以选择其它软件,例如:Sublime Text.Ru ...

  8. devise安装使用指南

    1.安装Devise 首先在gemfile中加上 gem 'devise' 在命令行中运行 bundle install 在项目中添加devise rails generate devise:inst ...

  9. devise第三方认证插件

    在一个Rails项目中安装: #在Gemfile中添加,目前版本3.4.1 gem 'devise'#然后只需bundle install 安装它.. bundle install#初始化devise ...

最新文章

  1. LeetCode 53. Maximum Subarray--动态规划--C++,Python解法
  2. Python使用shape计算矩阵的行和列
  3. DeepMind发布最新《神经网络中持续学习》综述论文!
  4. html中表格的页眉页脚,有一个标准的页眉页脚布局HTML网页,而无需使用table标签...
  5. CloudStack4.1.1升级CloudPlatForm4.2.0实践手册
  6. 学习总结初篇:发现问题
  7. sphinx随笔记了一下
  8. js中null,undefined,false,0,'',[],{}判断方法
  9. INNODB表快速迁移
  10. 2009-2021计算机408统考真题及解析分享
  11. JS技能点--日期时间格式化
  12. 境外支付宝接口对接--支付接口
  13. 肿瘤基因检测的解读流程
  14. centos 官网下载
  15. 322. Coin Change
  16. python如何编写温度转换_Python温度转换实例分析
  17. 0926 - 微商的动力
  18. 10 分钟把你的 Web 应用转为桌面端应用
  19. GBase xdm产品概述
  20. 流水作业调度(动态规划)

热门文章

  1. 苹果iphone手机哪些机型支持刷公交卡
  2. 蓝桥杯练习:费解的开关
  3. CSS 让元素内子元素翻转排序
  4. lay和lied_lie-lie-lay三个动词的区别
  5. 食谱生成器与营养计算器的核心部分设计
  6. 消费无人机难有新突破,行业无人机成极飞科技唯一突破口?
  7. 坚果云 linux 使用方法,树莓派4B踩坑指南 - (10)安装坚果云(暂时失败)
  8. 录屏怎么录?你知道多少录屏软件?
  9. 使用Codemirror的markdown编辑器和使用showdown的Vue.js预览器
  10. Envoy 架构、术语与基本配置解析