rails使用devise验证
2015-06-06 21:06
399 查看
使用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
如果在用户验证功能里需要用到邮件验证,则需要把下面的代码加到config/environments/development.rb 和 production.rb中
二、添加Model
既然作为用户验证,肯定组要验证的ID和Password,所以需要建立Model,使用devise来建立model,并且迁移数据库:
下面做一些测试工作,在app/view/welcom/index.html.erb中写入如下代码:
可以看到一个功能完整的登录页面,并且有注册的链接,注册一个账户可以实现登录等功能,并且能够保持session会话。同时无论是wareshark抓包还是进入数据库,可以看到账户的密码都是加密的,安全性很好
当然这里可以发现登录的ID是邮件,很多时候我们用到的还是一个用户名而不是邮件,所以这里当然可以改成username。
首先给Model添加用户名属性,并且迁移数据库
这样就成功将username属性添加到数据库中,并且设置为唯一。然后修改config/initializers/devise.rb文件,找到config.authentication_keys = [ :email ]这一行,改为下面这样:
顾名思义就是不再需要email验证,但是这里还会有一个问题,那就是虽然不验证email了,但是如果在注册第二个账户的时候,会出现注册失败的情况,那就是因为在初始建表的时候,email被设置为unique,而email默认为“”,会导致注册第二个账户时因为email也是“”导致报错。所以还需要将email的index取消掉,取消需要写一个新的迁移文件
三、使用bootstrap风格的Devise
前面实现的用户验证界面还是挺简陋的,所以这里还是使用比较流行bootstrap前端框架美化一下
首先安装twitter-bootstrap-rails,我安装的是功能更加丰富的LESS样式,在Gemfile文件种添加依赖
然后bundle install安装文件并且生成bootstrap然后添加到assets中
然后再把application.css文件名改为application.css.less,进入该文件并且添加:
这样一来,就大功告成了,可以看一下最终的页面了
![](https://img-blog.csdn.net/20150607023106360?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXNjNjY4OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
样式和官方给的不太一样,下次有时间再研究研究
比如登陆安全验证,要让自己来写需要考虑很多:
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:viewsdevise会自动在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::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_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里添加如下代码
protected def email_required? false end
顾名思义就是不再需要email验证,但是这里还会有一个问题,那就是虽然不验证email了,但是如果在注册第二个账户的时候,会出现注册失败的情况,那就是因为在初始建表的时候,email被设置为unique,而email默认为“”,会导致注册第二个账户时因为email也是“”导致报错。所以还需要将email的index取消掉,取消需要写一个新的迁移文件
rails g migration remove_index然后进入db/migrate可以找到新生城的文件,改为如下代码:
class RemoveIndex < ActiveRecord::Migration def change remove_index :users, :column => :email end 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
这样一来,就大功告成了,可以看一下最终的页面了
样式和官方给的不太一样,下次有时间再研究研究
相关文章推荐
- bootstrap初试进度条
- Bootstrap 3.3.4 发布,Web 前端 UI 框架
- 红宝石(Ruby)史话
- 浅谈Rails 4 中Strong Parameters机制
- 简单对比分析Ruby on Rails 和 Laravel
- 在 Ubuntu 12.04 Server 上安装部署 Ruby on Rails 应用
- Ruby on Rails下的图像处理入门教程
- rails创建应用程序实例
- Rails Routes中new、collection、member的区别浅析
- web 应用中常用的各种 cache详解
- win7安装ruby on rails开发环境
- 基于Bootstrap的网页设计实例
- 精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
- BootStrap实现带有增删改查功能的表格(DEMO详解)
- 通过Tabs方法基于easyUI+bootstrap制作工作站
- BootStrap栅格系统、表单样式与按钮样式源码解析
- rails "No route matches" 错误的解决方法
- Rails link_to 详解
- Ruby rails 页面跳转(render和redirect_to)
- 在yii中新增一个用户验证的方法详解