- 浏览: 237048 次
- 性别:
- 来自: 内蒙古
文章分类
- 全部博客 (236)
- Android 功能实现 (31)
- sql数据库的学习 (8)
- Android 美化界面 (2)
- Android 优化 (1)
- Ruby on Rails 方面 (45)
- git 方面的学习 (1)
- ruby 编程的琢磨 (13)
- linux下工具软件 (13)
- 操作系统的学习 (40)
- 非技术 (13)
- 网站开发 (18)
- js 学习笔记 (19)
- css学习 (5)
- 回顾总结 (2)
- Delphi 学习 (2)
- C 语言学习笔记 (1)
- 数据结构 (1)
- node js 学习 (6)
- 设计模式 (2)
- mongdb 学习笔记 (0)
- 软件服务 (3)
- osx系统 (4)
- 搜索引擎 (1)
- 测试工具 (1)
- Aliyun (1)
- 前端JS (1)
- python学习 (0)
- iOS系统 (1)
- 分布式锁 (1)
- 开发工具 (0)
- java代码 (2)
- java (0)
最新评论
-
jiguanghover:
写的不错,收藏一下
Ubuntu下RVM, Ruby, rails安装详细 和 卸载 -
maoghj:
回顾总结(二) -
yun2223:
对楼主表示感谢
Android控件开发之Gallery3D效果 -
zw_lovec:
说清楚点吧 亲 加点注释
out of memory -
lzyfn123:
http://www.iteye.com/images/smi ...
ruby-string 字符串的学习
来自:http://hlee.iteye.com/blog/673386
在上一篇的介绍Devise【视频,阅读】中,我们已经可以在我们的Rails应用中搭建和使用devise的基本功能了。现在,我们从上一篇介绍留下来的问题开始,来阐述如何定制devise。
在上一篇的介绍里,我们已经可以在rails项目里通过devise很容易的添加注册,登录和退出的功能:
访问限制
接下来,我们将实现限制访问。在我们这个应用中(译者注:我们开发的是一个简单的项目管理系统),就是对于创建,修改和删除项目进行权限控制,只有注册并且登录的用户才能有权操作。
我们通过在中ProjectsController添加一个before_filter,在其中调用devise提供的检查是否授权的方法authenticate_user!。这个方法会检查Project下的所有方法,如果,用户没有登录并且试图调用该方法的时候,就会跳转到登录页面。理论上讲,没有登录的用户也应该可以访问index和show方法,也就是说,我们还应该添加一个:except选项来保证用户可以正常方法上面两个方法:
- class ProjectsController < ApplicationController
- before_filter :authenticate_user!, :except => [:show, :index]
- def index
- #rest of class
那么现在,我们点击“New Project”链接,因为我们还没有登录,上面的访问限制就会其作用,页面会跳转到登录页面:
如果,我们仅仅是用来实现简单的是否登录的检查,那devise已经可以很好很简单的处理了。然而,如果我们的授权和访问控制很复杂(译者注:多角色,多用户,交叉权限等),这时我们需要额外的授权控制的插件来实现,比如我们在第192【视频,阅读】中介绍的CanCan一起使用,解决实际的业务需求。
定制Devise的页面显示
我们上209集就遗留一个问题,就是devise会自动为我们生成权限维护过程中的view,那么当我们需要页面的风格和我们的风格一致的时候,就需要自己来定制显示了。Devise也考虑到了这一点,提供了如下途径来解决这个问题。因为devise本身是基于Rails引擎的,只要覆盖原来的页面(实际是override原来的方法)就可以实现定制的要求了。同时devise提供了一个方便的generate方法用来生成这些用来重载的页面方法,如下:
- $ rails generate devise_views
- create app/views/devise
- create app/views/devise/confirmations/new.html.erb
- create app/views/devise/mailer/confirmation_instructions.html.erb
- create app/views/devise/mailer/reset_password_instructions.html.erb
- create app/views/devise/mailer/unlock_instructions.html.erb
- create app/views/devise/passwords/edit.html.erb
- create app/views/devise/passwords/new.html.erb
- create app/views/devise/registrations/edit.html.erb
- create app/views/devise/registrations/new.html.erb
- create app/views/devise/sessions/new.html.erb
- create app/views/devise/shared/_links.erb
- create app/views/devise/unlocks/new.html.erb
这个命令复制了所有devise中的页面,那么,也就是说我们只要编辑修改对应的页面和我们原来的项目风格一致。如下,是我们登录页面的代码:
- #/app/views/devise/sessions/new.html.erb
- <h2>Sign in</h2>
- <%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>
- <p><%= f.label :email %></p>
- <p><%= f.text_field :email %></p>
- <p><%= f.label :password %></p>
- <p><%= f.password_field :password %></p>
- <% if devise_mapping.rememberable? -%>
- <p><%= f.check_box :remember_me %> <%= f.label :remember_me %></p>
- <% end -%>
- <p><%= f.submit "Sign in" %></p>
- <% end %>
- <%= render :partial => "devise/shared/links" %>
我们会修改如下:
- #/app/views/devise/sessions/new.html.erb
- <% title "Sign In" %>
- <%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>
- <ol class="formList">
- <li><%= f.label :email %> <%= f.text_field :email %></li>
- <li><%= f.label :password %> <%= f.password_field :password %></li>
- <% if devise_mapping.rememberable? -%>
- <li><%= f.check_box :remember_me %> <%= f.label :remember_me %></li>
- <% end %>
- <li><%= f.submit "Sign in" %></li>
- </ol>
- <% end %>
- <%= render :partial => "devise/shared/links" %>
我们可以从上面的代码看到用在定制自己页面的时候,我们title的方法替换了header,这种修改页面的方法,我们在第30集【观看,阅读】也可以通过如下git gem来查询相关nifty generators。我们也可以看到我们还修改了,页面的布局用ol标签,加上一个formlist类,这样我们的css就其作用,原来简单的devise的界面,就能够变成我们需要的界面了。
定制错误提示信息
Devise处理错误信息的方式是把所有需要的信息都用i18n的方式保存在config/local目录下,这样就很容易修改和翻译。比如,当输入了错误的email和password的时候,会提示“invalid email or password”如果想要修改这个错误提示,只需要修改对应文件下的devise.failure.invalid错误提示:
- #/config/locales/devise.en.yml
- en:
- errors:
- messages:
- not_found: "not found"
- already_confirmed: "was already confirmed"
- not_locked: "was not locked"
- devise:
- failure:
- unauthenticated: 'You need to sign in or sign up before continuing.'
- unconfirmed: 'You have to confirm your account before continuing.'
- locked: 'Your account is locked.'
- invalid: 'OH NOES! ERROR IN TEH EMAIL!'
- invalid_token: 'Invalid authentication token.'
- timeout: 'Your session expired, please sign in again to continue.'
- inactive: 'Your account was not activated yet.'
- sessions:
- signed_in: 'Signed in successfully.'
- signed_out: 'Signed out successfully.'
- #rest of file omitted.
这时,当我们再登录并且输入错误的email地址时我们就会看到我们修改的错误提示了:
上面的是错误提示信息,那么,如果我们希望修改validation的验证错误提示呢,比如,在注册过程中不符合要求的字段提示信息,如下:
针对validation Devise有一个配置文件,在/config/initializers/ devise.rb文件中,这个文件保存了很多和devise相关的配置信息。这些配置选项有很好的文档注释,以便容易找到对应的选项并且做出修改。那么,如果我们想要把口令的最小长度从原来的6位减少到4位,那么,只需要去掉对应的注释,并修改对应的配置选项。值得注意的是,修改完配置文件后,需要重启server才能够加载生效。
- #/config/initalizers/devise.rb
- # ==> Configuration for :validatable
- # Range for password length
- # config.password_length = 6..20
如果,我们的验证信息更复杂,devise的选项根本没有办法满足,那么我们也可以通过去掉devise的validatable模块,并且自己在User model中添加自己的验证信息的方式来添加自己的独特定制验证信息。
- #/app/models/user.rb
- class User < ActiveRecord::Base
- # Include default devise modules. Others available are:
- # :token_authenticatable, :lockable, :timeoutable and :activatable
- # :confirmable,
- devise :database_authenticatable, :registerable,
- :recoverable, :rememberable, :trackable, :validatable
- # Setup accessible (or protected) attributes for your model
- attr_accessible :email, :password, :password_confirmation
- end
我们可以看到在User的描述中devise方法有很多参数(译者注:就是devise的11个功能模块是否使用的配置。)其中,:validatable就是用来实现注册过程的字段验证的。如果,我们希望自己定制这些字段检查,那么我们就需要先去掉这个:validatable的描述,然后,在User中添加自己需要的字段验证,虽然,devise允许这样自己定制。然后,大部分的情况devise提供的字段验证已经可以处理
路由
定制路由,是说例如devise默认注册页面在/users/sign_up但是比如,我们想要改到/register。实际上默认的devise路由是通过router.rb中的devise_for :users提供的。当然,这些路由devise也提供了修改途径:
- #/config/routes.rb
- ProjectManage::Application.routes.draw do |map|
- devise_for :users
- resources :projects
- root :to => 'projects#index'
- end
比如上面的需求,我们可以通过添加path_names的参数达到,如下:
- #/config/routes.rb
- ProjectManage::Application.routes.draw do |map|
- devise_for :users, :path_names => { :sign_up => "register" }
- resources :projects
- root :to => 'projects#index'
- end
当我们完成上面的修改之后,当我们再试图通过/users/sign_up来注册的时候就会看到没有路由的错误信息,而通过/users/register就可以正常注册。对于devise_for的路由还有很多其他的参数来帮助定制路由,这可以通过参考devise的文档得到。
定制登录信息
当前devise的配置是通过用户email和用户口令登录。那么,很可能有些项目需要用用户名登录,devise也考虑到了这点,通过简单的配置就可以转换成用户名登录。
首先,要用用户名登录就得先增加一个username的字段
因为当前我们只有一个用户,所以,我们不用谢migrate去处理之前没有username字段的数据,只要在控制台简单的修改一下就可以:
- $ rails c
- Loading development environment (Rails 3.0.0.beta2)
- ruby-1.8.7-p249 > User.first.update_attribute(:username, "eifion")
- => true
修改完数据库,已经有登录字段了,那么接着,我们要修改对应的配置文件/config/initializers/devise.rb来指明用不username登录。就是修改config.authentication_keys把 :email 变成 :username:
这个配置的修改就可以通过username字段来验证登录,当然我们还应该修改/app/views/devise/sessions/new.html.erb页面,以便输入的字段也使用用户名。
- #/app/views/devise/sessions/new.html.erb
- <% title "Sign In" %>
- <%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>
- <ol class="formList">
- <li><%= f.label :username %> <%= f.text_field :username %></li>
- <li><%= f.label :password %> <%= f.password_field :password %></li>
- <% if devise_mapping.rememberable? -%>
- <li><%= f.check_box :remember_me %> <%= f.label :remember_me %></li>
- <% end %>
- <li><%= f.submit "Sign in" %></li>
- </ol>
- <% end %>
- <%= render :partial => "devise/shared/links" %>
注册页面的表单也需要进行相关的修改,以便注册时能够添加用户名,当然对于的输入类型验证也应该包括用户名。和登录的表单类似就不展示了。
当完成以上的配置修改之后,重启服务器我们就可以通过用户名登录了:
这就是定制devise的内容了,通过上面的介绍,我们可以看到Devise是个相当完善的Rails权限管理系统,既有很好的默认配置,也支持灵活的定制。
发表评论
-
OpenSSL功能集合
2020-04-22 18:59 344OpenSSL中算法记录 1、证书(X.509证书 ... -
Aliyun-OSS 使用 - 图片持久化
2020-03-03 13:04 459Aliyun OSS 使用 - 图片持久化 参考:ali ... -
Sign in with Apple REST API (Rails)
2020-02-28 12:30 1032# 文档(Apple授权登录) https://deve ... -
RQRCode插件使用
2019-03-07 15:08 276def config { le ... -
gems 列表(rails 插件) 二
2014-11-19 19:41 453rails_best_practices 最佳实现 new ... -
rails 利用 Spreadsheet 导出xls格式数据
2014-10-08 17:22 6731、链接 XXX_path(forma ... -
rvm 使用记录
2014-09-26 11:11 532rvm是一个命令行工具,可以提供一个便捷的多版本ruby环 ... -
rails3内置gem包
2014-09-10 13:14 461rails3内置gem包: ... -
rails mongoid + carrierwave
2014-06-13 18:11 620中间插件:gem 'carrierwa ... -
rails 错误提示样式
2014-06-11 10:20 479源码 # Specify the proc us ... -
ROR Callbacks函数
2014-05-13 16:49 443Active Record Callbacks: ## ... -
字符串与对象的转化
2014-03-06 10:51 619classify: http://apidock.com/ ... -
nginx+unicorn+rails 配置文件
2014-02-17 14:43 586nginx+unicorn+rails 配置文件 ... -
ruby 里的正则表示
2014-01-22 17:27 0# ruby 中的正则表示 ... -
rails中Elasticsearch的客户端Tire配置
2014-01-22 15:25 1119$ gem install tire || http ... -
rails 多表关联
2013-12-09 16:28 0rails 多表关联 class Post < ... -
rails 测试 Rspec
2013-11-14 13:32 0在Gemfile中加入: group :test, ... -
rails 评论/回复插件 acts_as_commentable_with_threading
2013-11-13 19:04 1183acts_as_commentable_with_thre ... -
rails Rspec测试框架
2013-11-03 17:46 604Rspec rails的测试框架 ... -
rails 配置详解
2013-09-16 17:05 1202配置文件(config) 在Rails中,可以 ...
相关推荐
This book is for web developers who are getting started with Rails and are looking for authentication solutions, as well as for Rails developers who are looking to extend their implementation of ...
您可以在下面找到使用信息,但其要点是您将运行rails g devise:views:tailwindcssed而不是正常的 devise:views。 如果您想切换回至Devise,您将不会遇到任何问题! 只需删除设计视图文件夹并运行正常的设计生成器...
如果您之前已经做到了这一点,你需要重新生成您的意见(见下面的“自定义视图”),然后再涂什么使你在第一时间做到这一点定制。设定地区您将需要按照《 中的说明在应用程序中设置语言环境。 如果要设置每个请求的...
Devise - 一个基于Warden的Rails灵活身份验证解决方案
devise-i18n-views已合并到。 您应该停止使用devise-i18n-views并开始使用devise-i18n 1.0.0或更高版本。... devise-i18n-views包含与Devise v2及更高版本兼容的视图。 此外,要完全翻译Devise,还
只是一个简单的模块,为提供短信功能,易于使用和定制。 这是工作版本。 # Developed and tested on:Ruby 2.1.0Rails 4.0.3Devise 3.2入门添加到Gemfile并bundle install 。 gem 'devise_sms_verifiable' 如果安装...
使用devise_openid_authenticatable的devise_example版本_Ruby_
devise-i18n, 设计 gem的翻译 devise-i18n 设计"是一种基于warden的Rails 灵活认证方案"。 国际化( aka i18n ) 是一个"计算机软件适应不同语言。区域差异和目标市场技术要求的方法"。在控制器。模型和其他领域中支持...
devise-jwt是一个扩展,它使用令牌进行用户身份验证。 它遵循原则。 当无法使用Cookie时,此gem只是它们的替代品。 作为cookie,以devise-jwt过期的令牌将强制具有过期时间。 如果您需要用户永不注销,那么使用...
devise_zxcvbn 插件拒绝弱口令,使用这是Ruby端口。 如果默认情况下分数低于4,将拒绝用户密码。 它还将电子邮件用作zxcvbn的用户输入,以拒绝包含电子邮件部分的密码(如果在前端使用zxcvbn.js,则也应这样做以...
设计异步 Devise Async提供了一种简单的方法,可将Devise配置为使用ActiveJob异步发送其电子邮件。安装将此行添加到应用程序的Gemfile中: gem 'devise-async' 然后执行: $ bundle或将其自己安装为: $ gem install...
gear ruby on rails项目 gear仅仅加入devise
Devise-Two-Factor是Devise的极简扩展,它通过方案提供对两因素身份验证的支持。 它: 允许您将两因素身份验证合并到现有模型中 对安全性持肯定态度,因此您不必 与两因素应用程序轻松集成,例如和 具有可扩展性...
为Devise添加UID支持。_Ruby_下载
具有Devise身份验证的模板RailsAngular应用程序_JavaSc
生成Devise验收测试。_Gherkin_Ruby_下载
嘉年华设计意见为 Carnival 应用程序生成设计视图安装将此行添加到应用程序的 Gemfile 中: gem 'carnival_devise_views' 然后执行: $ bundle或者自己安装: $ gem install carnival_devise_views用法 $ rails g ...
Devise::PhoneConfirmable在 mri 2.2+ 和 rails 4.2+ 上经过充分测试和保证。 但它也应该适用于以前的版本。安装将此行添加到应用程序的 Gemfile 中: gem 'devise-phone_confirmable' 然后执行: $ bundle快速开始...
使用RubyonRails、Devise和Omniauth登录Twitter的教程_Ruby