- 浏览: 2048587 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
在上一篇的介绍Devise【视频,阅读】中,我们已经可以在我们的Rails应用中搭建和使用devise的基本功能了。现在,我们从上一篇介绍留下来的问题开始,来阐述如何定制devise。
在上一篇的介绍里,我们已经可以在rails项目里通过devise很容易的添加注册,登录和退出的功能:
访问限制
接下来,我们将实现限制访问。在我们这个应用中(译者注:我们开发的是一个简单的项目管理系统),就是对于创建,修改和删除项目进行权限控制,只有注册并且登录的用户才能有权操作。
我们通过在中ProjectsController添加一个before_filter,在其中调用devise提供的检查是否授权的方法authenticate_user!。这个方法会检查Project下的所有方法,如果,用户没有登录并且试图调用该方法的时候,就会跳转到登录页面。理论上讲,没有登录的用户也应该可以访问index和show方法,也就是说,我们还应该添加一个:except选项来保证用户可以正常方法上面两个方法:
那么现在,我们点击“New Project”链接,因为我们还没有登录,上面的访问限制就会其作用,页面会跳转到登录页面:
如果,我们仅仅是用来实现简单的是否登录的检查,那devise已经可以很好很简单的处理了。然而,如果我们的授权和访问控制很复杂(译者注:多角色,多用户,交叉权限等),这时我们需要额外的授权控制的插件来实现,比如我们在第192【视频,阅读】中介绍的CanCan一起使用,解决实际的业务需求。
定制Devise的页面显示
我们上209集就遗留一个问题,就是devise会自动为我们生成权限维护过程中的view,那么当我们需要页面的风格和我们的风格一致的时候,就需要自己来定制显示了。Devise也考虑到了这一点,提供了如下途径来解决这个问题。因为devise本身是基于Rails引擎的,只要覆盖原来的页面(实际是override原来的方法)就可以实现定制的要求了。同时devise提供了一个方便的generate方法用来生成这些用来重载的页面方法,如下:
这个命令复制了所有devise中的页面,那么,也就是说我们只要编辑修改对应的页面和我们原来的项目风格一致。如下,是我们登录页面的代码:
我们会修改如下:
我们可以从上面的代码看到用在定制自己页面的时候,我们title的方法替换了header,这种修改页面的方法,我们在第30集【观看,阅读】也可以通过如下git gem来查询相关nifty generators。我们也可以看到我们还修改了,页面的布局用ol标签,加上一个formlist类,这样我们的css就其作用,原来简单的devise的界面,就能够变成我们需要的界面了。
定制错误提示信息
Devise处理错误信息的方式是把所有需要的信息都用i18n的方式保存在config/local目录下,这样就很容易修改和翻译。比如,当输入了错误的email和password的时候,会提示“invalid email or password”如果想要修改这个错误提示,只需要修改对应文件下的devise.failure.invalid错误提示:
这时,当我们再登录并且输入错误的email地址时我们就会看到我们修改的错误提示了:
上面的是错误提示信息,那么,如果我们希望修改validation的验证错误提示呢,比如,在注册过程中不符合要求的字段提示信息,如下:
针对validation Devise有一个配置文件,在/config/initializers/ devise.rb文件中,这个文件保存了很多和devise相关的配置信息。这些配置选项有很好的文档注释,以便容易找到对应的选项并且做出修改。那么,如果我们想要把口令的最小长度从原来的6位减少到4位,那么,只需要去掉对应的注释,并修改对应的配置选项。值得注意的是,修改完配置文件后,需要重启server才能够加载生效。
如果,我们的验证信息更复杂,devise的选项根本没有办法满足,那么我们也可以通过去掉devise的validatable模块,并且自己在User model中添加自己的验证信息的方式来添加自己的独特定制验证信息。
我们可以看到在User的描述中devise方法有很多参数(译者注:就是devise的11个功能模块是否使用的配置。)其中,:validatable就是用来实现注册过程的字段验证的。如果,我们希望自己定制这些字段检查,那么我们就需要先去掉这个:validatable的描述,然后,在User中添加自己需要的字段验证,虽然,devise允许这样自己定制。然后,大部分的情况devise提供的字段验证已经可以处理
路由
定制路由,是说例如devise默认注册页面在/users/sign_up但是比如,我们想要改到/register。实际上默认的devise路由是通过router.rb中的devise_for :users提供的。当然,这些路由devise也提供了修改途径:
比如上面的需求,我们可以通过添加path_names的参数达到,如下:
当我们完成上面的修改之后,当我们再试图通过/users/sign_up来注册的时候就会看到没有路由的错误信息,而通过/users/register就可以正常注册。对于devise_for的路由还有很多其他的参数来帮助定制路由,这可以通过参考devise的文档得到。
定制登录信息
当前devise的配置是通过用户email和用户口令登录。那么,很可能有些项目需要用用户名登录,devise也考虑到了这点,通过简单的配置就可以转换成用户名登录。
首先,要用用户名登录就得先增加一个username的字段
因为当前我们只有一个用户,所以,我们不用谢migrate去处理之前没有username字段的数据,只要在控制台简单的修改一下就可以:
修改完数据库,已经有登录字段了,那么接着,我们要修改对应的配置文件/config/initializers/devise.rb来指明用不username登录。就是修改config.authentication_keys把 :email 变成 :username:
这个配置的修改就可以通过username字段来验证登录,当然我们还应该修改/app/views/devise/sessions/new.html.erb页面,以便输入的字段也使用用户名。
注册页面的表单也需要进行相关的修改,以便注册时能够添加用户名,当然对于的输入类型验证也应该包括用户名。和登录的表单类似就不展示了。
当完成以上的配置修改之后,重启服务器我们就可以通过用户名登录了:
这就是定制devise的内容了,通过上面的介绍,我们可以看到Devise是个相当完善的Rails权限管理系统,既有很好的默认配置,也支持灵活的定制。
在上一篇的介绍里,我们已经可以在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也考虑到了这点,通过简单的配置就可以转换成用户名登录。
$ rails generate migration add_username_to_users username:string
首先,要用用户名登录就得先增加一个username的字段
$ rake db:migrate
因为当前我们只有一个用户,所以,我们不用谢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:
#/config/initializers/devise.rb config.authentication_keys = [ :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权限管理系统,既有很好的默认配置,也支持灵活的定制。
评论
2 楼
dadadada2x
2015-04-10
user模型里加上
protected
def email_required?
false
end
protected
def email_required?
false
end
1 楼
wikimo
2011-04-15
请教下,email改成username后,通过validatable 还是提示email can't be blank 要如何解的。
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 887heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3213reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3238alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1433问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1340这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1297以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1856首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2236这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2224开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1191class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8089TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 1975刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1432这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1895面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17144git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2675简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 910第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1655开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12898Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2068又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
gem 'devise_zxcvbn' 配置 class User < ActiveRecord :: Base devise :zxcvbnable # Optionally add more weak words to check against: def weak_words [ 'mysitename' , self . name , self .
devise-i18n, 设计 gem的翻译 devise-i18n 设计"是一种基于warden的Rails 灵活认证方案"。 国际化( aka i18n ) 是一个"计算机软件适应不同语言。区域差异和目标市场技术要求的方法"。在控制器。模型和其他领域中支持...
安装添加到您的Gemfile中: gem 'devise-i18n' 假设您以前没有在项目中生成Devise的视图,那就是您需要做的。 如果您之前已经做到了这一点,你需要重新生成您的意见(见下面的“自定义视图”),然后再涂什么使你在...
gem 'devise_sms_verifiable' 如果安装了 ,请运行生成器以将配置设置添加到初始化程序: $ rails generate devise_sms_verifiable:install否则使用这个生成器: $ rails generate devise:install生成迁移: $ ...
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 ...
安装将此行添加到应用程序的Gemfile中: gem 'devise-async' 然后执行: $ bundle或将其自己安装为: $ gem install devise-async用法设置 , 将:async添加到模型中的devise调用中: class User < ActiveRecord :...
Devise - 一个基于Warden的Rails灵活身份验证解决方案
使用Devise的Noodall用户登录和管理_Ruby_下载
Graphql Devise生成器将执行Devise和Devise Token Auth生成器以在您的项目中设置gem。 您可以像往常一样使用其初始化程序文件(每个gem一个)自定义它们。 $ bundle exec rails generate graphql_devise:install ...
当无法使用Cookie时,此gem只是它们的替代品。 作为cookie,以devise-jwt过期的令牌将强制具有过期时间。 如果您需要用户永不注销,那么使用刷新令牌(例如OAuth2的某些实现)的解决方案会更好。 您可以在以下系列...
安装: 添加到您的 gemfile:“” gem 'devise', '~>3.2.0' gem 'devise_invitable' gem 'beta_invites', github: 'danman01/beta_invites' “` 启动前: 将 gems devise 和 devise_invitable 添加到您的 gemfile ...
# gem install devise # rails g devise:install # rails g devise User gem install devise - guests rails g devise_guests User 用法 # Where you might use current_user; now you can use current_or_guest_...
这个 gem 使用 Latch 帐户为任何使用 devise gem 的 Rails 应用程序添加了一个额外的安全层。 为了使用这个 gem,你需要知道如何使用 rails 和 devise 开发简单的应用程序。 Devise 是一个为您处理用户注册和登录...
权威设计 这是一个扩展,用于将添加到Rails应用程序。OneTouch支持通用身份验证令牌支持Rails 5 ... $ export AUTHY_API_KEY=YOUR_AUTHY_API_KEY 接下来,将gem添加到您的Gemfile中: gem 'devise'gem 'devise-authy'
使用devise_openid_authenticatable的devise_example版本_Ruby_
安装要安装gem,只需添加一个 gem "devise_browserid_authenticatable"到您的Gemfile并运行bundle install 。 创建初始化器,并在rails generate browser_id:install 。 要启用看守策略,请将以下行添加到config/...
gem 'devise-auth0' 然后执行: $ bundle 或将其自己安装为: $ gem install devise-auth0 配置 在config/initializers/devise.rb : require 'devise/strategies/auth0_authenticatable' Devise . setup do |...
安装将此行添加到应用程序的 Gemfile 中: gem 'devise-phone_confirmable' 然后执行: $ bundle快速开始 TODO add generator # app/models/user.rbdevise :database_authenticatable , ... . , :phone_...