`

流行的权限管理 gem devise的定制

阅读更多
在上一篇的介绍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也考虑到了这点,通过简单的配置就可以转换成用户名登录。
$ 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权限管理系统,既有很好的默认配置,也支持灵活的定制。

  • 大小: 37.5 KB
  • 大小: 44.4 KB
  • 大小: 39.6 KB
  • 大小: 43.2 KB
  • 大小: 59.6 KB
  • 大小: 41.3 KB
分享到:
评论
2 楼 dadadada2x 2015-04-10  
user模型里加上 
protected

  def email_required?
    false
  end
1 楼 wikimo 2011-04-15  
请教下,email改成username后,通过validatable 还是提示email can't be blank 要如何解的。

相关推荐

    使用Devise的Noodall用户登录和管理_Ruby_下载.zip

    Devise不直接处理角色和权限,但可以通过添加如cancancan或pundit这样的授权库来实现。这些库允许你定义用户的角色并控制他们能访问哪些资源。 9. **定制行为** 如果需要扩展Devise的功能,可以重写或添加控制器...

    具有Devise身份验证的模板RailsAngular应用程序_JavaSc.zip

    标题中的“具有Devise身份验证的模板RailsAngular应用程序”指的是一个使用Ruby on Rails框架和AngularJS前端库构建的Web应用程序,其中集成了Devise gem进行用户身份验证。这个项目可能是为了展示如何在Rails后端与...

    展示如何将Devise与Doorkeeper(OAuth2提供商)一起使.zip

    Devise是一个强大的、易于定制的Rails gem,用于处理用户认证。它包含了常见的认证功能,如密码重置、确认电子邮件、记住我等。Devise通过模型、控制器、视图以及会话来管理用户的登录、注册和注销过程。它使用...

    awesome-rails-gem-zh_CN, Rails 常用 Gem 列表 - Awesome Rails Gem 中文版.zip

    2. **CanCanCan**:用于授权管理,允许开发者定义用户能做什么,不能做什么,使得权限控制更加简洁。 3. **ActiveAdmin**:一个用于构建后台管理界面的工具,提供丰富的界面元素和CRUD操作。 4. **Paperclip** 和 ...

    devise_implementation:学习实现多帐户登录的设计

    在Gemfile中添加`gem 'devise'`,然后运行`bundle install`来安装。接着,通过运行`rails generate devise:install`命令初始化Devise,这会创建必要的配置文件并设置默认的路由。 在实现多账户登录时,我们需要创建...

    phcdevworks_accounts:使用Devise的Ruby on Rails 6身份验证和用户管理引擎,具有漂亮的仪表板,管理面板和登录视图,可帮助您快速进行下一个项目

    这个框架的核心是 "Devise",这是一个流行的Ruby on Rails gem,用于处理复杂的用户认证问题。通过集成Devise,该引擎能确保用户的安全登录和会话管理。 "内置额外的用户信息" 暗示了该引擎不仅仅提供了基本的身份...

    Ruby-Administrate一个框架用于在Rails中创建灵活的强大的管理仪表板

    7. **权限控制**:虽然Administrate本身不提供用户认证和权限管理,但它可以与如Devise或Pundit等库结合使用,实现对后台访问的控制。 8. **插件系统**:Administrate有一个活跃的社区,提供了许多插件,可以扩展其...

    Ruby-Doorkeeper是Rails的一个OAuth2提供者OAuth20协议的一个Ruby封装

    7. **兼容性**:Doorkeeper可以与其他流行的Rails库和gem(如Devise进行用户认证)无缝集成,增强了其灵活性和可扩展性。 8. **安全性**:Doorkeeper遵循OAuth 2.0规范,确保了授权和令牌的加密存储,防止未授权...

    saas-project-app:一种项目管理工具,可帮助您的团队跟踪您的项目和项目文件

    "Devise-views" 提供了定制 Devise 的视图模板的能力,以便更好地融入应用的外观和感觉。此外,"devise-token-auth" 为移动和 API 客户端提供了基于令牌的认证,适应了现代跨平台项目的需求。 数据库方面,"sqlite3...

    inspinia admin - v2.5 Rails_Seed_Project

    4. **集成的Gem包**:Rails_Seed_Project整合了如Devise(用户认证)、CanCanCan(权限控制)等常用Rails插件,帮助开发者实现复杂的功能模块。 5. **脚手架生成器**:项目可能还包括了一些脚手架(Scaffold)生成...

    principal-principle:学校管理员管理工具和Flatiron Rails应用程序

    "principal-principle"可能依赖了一些如Devise(用户认证)、Pundit(授权管理)、ActionCable(实时通信)等Gem。 7. **Rake任务**:Rake是Ruby的一个构建工具,允许开发者定义自己的命令行任务。在这个项目中,...

    Rails插件收集

    描述中的“NULL”表明没有给出具体的插件列表或详细描述,但通常Rails插件可能包括但不限于数据库管理工具、认证与授权机制、表单处理、搜索引擎优化、日志分析、测试工具、性能监控等类别。通过博文链接...

    Agile Web Development with Rails 4th -Final Edition

    通过gem,开发者可以轻松地复用和扩展功能,如Devise用于身份验证,CanCanCan用于授权,或是Paperclip或Carrierwave用于文件上传等。这些gem的使用方法在书中都有所介绍。 除此之外,书中还涵盖了部署和优化Rails...

    rails_template:我制作了一个 Rails 模板

    这意味着他们可能已经包含了一些特定的开发习惯、最佳实践或者特定的gem集,比如Devise用于用户认证,CanCanCan或Pundit进行权限管理,或者像Webpacker来处理前端资产。这个模板可以是用于内部团队的标准化,也可以...

    acts_as_authenticated

    最后,虽然acts_as_authenticated在当时是一个流行的解决方案,但随着Rails的发展,现在有更多的现代认证解决方案出现,如devise和warden。这些现代库提供了更多功能,如邮件验证、密码重置、多因素认证等,并且社区...

    SamuraiCRM:基于Modular Rails Book的CRM

    此外,为了优化数据操作,可能还使用了如Pundit或CanCanCan这样的授权库,来定义和控制用户的访问权限。 任务跟踪和日程管理也是CRM系统不可或缺的元素。SamuraiCRM可能集成了日历功能,允许用户创建、分配和追踪...

    Rails True Dynamic Portal-开源

    由于开源的性质,开发者可以利用大量的gem(Rails的库)来扩展功能,例如Devise用于用户认证,CanCanCan处理权限控制,ActiveAdmin提供后台管理界面。这些gem的存在大大降低了开发复杂性的门槛,使得开发者可以更加...

    应用rails进行敏捷Web开发·第三版

    12. **社区与工具**:Rails拥有活跃的开发者社区,提供了许多有用的gem(Ruby的库),如Devise用于身份验证,Pundit或CanCanCan处理权限管理。 通过学习《应用Rails进行敏捷Web开发·第三版》,开发者不仅能掌握...

    pistoncms:开发人员的CMS

    7. **权限和认证**:了解如何实现用户身份验证和授权,如Devise或CanCanCan库的使用。 8. **前端技术**:CSS预处理器(如Sass或Less)、JavaScript库(如jQuery)和前端框架(如Bootstrap)的应用。 9. **测试**:...

    TimeTracker:多租户时间跟踪器 Rails 应用

    可能使用Devise或Auth0进行用户认证,Pundit或CanCanCan处理授权,确保租户只能访问和操作他们自己的数据。 综上所述,`TimeTracker`是一个全面考虑了开发流程、测试策略、SaaS架构和用户体验的Rails应用,展示了...

Global site tag (gtag.js) - Google Analytics