device登录认证插件2

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://kinda22.blog.51cto.com/2969503/1587991

在一个Rails项目中安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#在Gemfile中添加,目前版本3.4.1
gem  'devise'
 
#然后只需bundle install 安装它..
bundle  install
 
#初始化devise
rails generate devise: install
 
#创建一个MODEL,指定名称..
rails generate devise user
 
#会生成一个迁移文件,可以对这个迁移文件做一些修改...
rake db:migrate

 

    配置开发环境默认的url..

1
2
3
4
#在开发环境中默认的url和生产环境可能有点不太一样..
#在下面development的文件中,增加下面的一行。
config /environments/development .rb 
      config.action_mailer.default_url_options = { host:  'localhost' , port: 3000 }

 

 

 

控制器过滤和helpers

    Devise创建了一些helpers在你的控制器和视图中

    建立与用户身份验证相关的控制权,只需要添加 before_action(假设你的用户模型是user)

1
before_action :authenticate_user!

    如果你的devise model不是user,替换"_user" 到 "_yourmodel", 同样的逻辑也适用于下面的命令.

 

扫描二维码关注公众号,回复: 496562 查看本文章

 

    验证用户是否登录

1
user_signed_in?

 

    当前登录的用户

1
current_user

 

    你可以访问的会话范围

1
user_session

 

    在一个用户注册后,确认账号或更新密码,Devise将重定向一个作用域到根路径

    例如:当使用一个 :user 资源,user_root_path如果存在,将会使用它。否则将使用默认的root_path

    这个root_path,是在你的routes中定义的

1
   root to:  "home#index"

    你也可以覆盖 after_sign_in_path_for 和 after_sign_out_path_for 到你自定义重定向的钩子

 

    注意:如果你的Devise model是member 不是user,例如:可用的帮助方法。。。

1
2
3
4
   before_action :authenticate_member!
   member_signed_in?
   current_member
   member_session

 

 

 

配置模型

    Devise在你的models中也可以支持一些选项来进行配置

    例如:你可以选择加密算法的开销

1
devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 2

    除了 :stretches, 你可以定义 :pepper ,  :encryptor ,  :confirm_within ,  :remember_for ,  :timeout_in ,  :unlock_in 。更多细节,你可以查看在 devise:install 时创建的初始化文件中 位置在

1
  config /initializers/devise .rb

 

 

 

健壮参数

    当你自定义你的视图时,你最总会向表单添加新属性。在Rails4中移除了从模型控制器的参数处理

    这里只有三个动作在Devise,允许任何的设置的参数被传递到模型中,所以需要被处理。

    它们的名字和默认情况下允许的参数是:

1
2
3
sign_in (Devise::SessionController #create)           只允许验证的keys(类似email)
sign_up (Devise::RegistrationsController #create)          允许验证的keys: password和password_confirmation
account_update (Devise::RegistrationsController #update)          允许验证的keys: password , password_confirmation 和 current_password

      

    如果你想允许额外的参数,你可以使用一个简单的过滤器 before_action 配置在你的控制器

1
2
3
4
5
6
7
8
class ApplicationController < ActionController::Base
   before_action :configure_permitted_parameters,  if : :devise_controller?
 
   protected
 
   def configure_permitted_parameters
     devise_parameter_sanitizer. for (:sign_up) << :username
   endend

    上面的代码是简单的类型上添加多个字段的参数。但是如果你有一个嵌套的属性(你应该使用accetps_nested_attributes_for), 然后你要告诉Devise那些是嵌套和类型。Devise允许你完全的改变默认的设计或自定义。

    允许简单的标量值的username和email。列如:

1
2
3
def configure_permitted_parameters
   devise_parameter_sanitizer. for (:sign_in) { |u| u.permit(:username, :email) }
end

 

     如果你有一些复选框,表示用户需要选择。浏览器会把那些复选框作为一个数组。这数组不是一个强壮参数允许的标量,所以需要配置Devise使用下面的方式:

1
2
3
def configure_permitted_parameters
   devise_parameter_sanitizer. for (:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation) }
end

 

     如果你有多个Devise模型,可能想要建立一个不同参数处理的模型。

     既然这样,推荐继承 Devise::ParameterSanitizer 到你的逻辑中.

1
2
3
4
5
class User::ParameterSanitizer < Devise::ParameterSanitizer
   def sign_in
     default_params.permit(:username, :email)  
   end
end

    然后配置你的控制器使用它:

1
2
3
4
5
6
7
8
9
10
class ApplicationController < ActionController::Base
   protected
 
   def devise_parameter_sanitizer
     if  resource_class == User
       User::ParameterSanitizer.new(User, :user, params)     else
       super  # Use the default one
     end
   end
end

    上面的例子覆盖用户允许参数 :username 和:email

 

 

 

配置视图

    Devise是一个引擎,所有的视图被打包在gem中。这些视图讲帮助你开始,但是一段时间后你可能需要求修改它们。如果是这种情况,你只需要通过下面的generator,并将所有视图复制到你的应用程序

1
rails generate devise:views

 

    如果你有超过一个Devise模型在你的应用(比如 user 和 admin),你将会发现所有的模型使用相同的视图。非常庆幸,Devise提供了一种简单的方法来定制视图。你需要配置 config.scoped_views = true 在config/initializers/devise.rb文件中。

    

    配置完之后,你将会有基础视图在这样的角色 usrs/sessions/new 和 adminssessions/new. 如果没有在这个范围内找到视图,Devise将会使用默认的视图devise/sessions/new 

  

    你还可以使用生成器,生成视图。

1
rails generate devise:views  users

 

    如果你想生成几个视图,比如只想要 registerable 和 confirmable 模块,你可以通过使用 -v标记在一个模块列表生成

1
rails generate devise:views - v  registrations confirmations

 

 

 

配置控制器

    如果定制视图的级别不够,你可以通过以下步骤定制每个控制

    1. 使用生成器创建控制器

1
rails generate devise:controllers [scope]

 

        如果你指定users为范围,控制器会被创建在 app/controllers/users/ 会话控制器看着像这样...

1
2
3
4
5
6
7
class Users::SessionsController < Devise::SessionsController
   # GET /resource/sign_in
   # def new
   #   super
   # end
   ...
end

 

    2. 告诉路由使用这个控制器

1
     devise_for : users , controllers: { session:  "users/sessions" }

 

    3. 拷贝视图从devise/sessions 到 users/sessions. 因为控制被改变,它不能使用默认的视图位置 devise/sessions

 

    4. 最后,改变或扩展控制器的操作。

        你可以完全覆盖一个控制器动作

1
2
3
4
5
class Users::SessionsController < Devise::SessionsController
   def create
     # custom sign-in code
   end
end

 

        或者你可以简单的添加新行为:

1
2
3
4
5
class Users::SessionsController < Devise::SessionsController
   def create
     super  do  |resource|      BackgroundWorker.trigger(resource)    end
   end
end

        这是用于触发后台左右或操作日志事件..

 

    记住,Devise使用flash 消息来让用户知道登陆成功或失败,Devise期望你的应用程序的情况调用flash[:notice] 和flash[:alert]。不要打印整个flash hash,只打印特定的keys。在某些情况下,Devise 添加一个 :timeout 的key在flash hash,这个不是用来显示的。如果你想打印整个hash,记得将这个key删除。

 

 

配置路由

    Devise附带默认路由。如果你需要定制它们,你应该通过devise_for方法去定义。它接受几个选项  :class_name , :path_prefix 等等,可能包括i18n改变的路径名

1
devise_for : users , path:  "auth" , path_names: { sign_in:  'login' , sign_out: }

    一定要检查devise_for 文档的细节

 

    如果你需要更多的深度定制,例如也允许 “/sign_in” 之外 "/users/sign_in",你所要做的就是创建一个正常的路由将它包裹在devise_scope路由器中

1
2
3
devise_scope :user  do
   get  "sign_in" , to:  "devise/sessions#new"
end

    这种方式,你告诉Devise使用的范围在 :user  当 "/sign_in"  被访问。注意devise_scope也类似你的路由器别名

 

 

I18N

    Devise使用fluash消息在i18n,并结合flash keys的 :notice 和 :alert。 定制你的应用,你可以设置本地文件..

1
2
3
4
en:
   devise:
     sessions:
       signed_in:  'Signed in successfully.'

 

    你可以配置基于资源的信息,在你的配置中使用单数的名字..

1
2
3
4
5
6
7
en:
   devise:
     sessions:
       user:
         signed_in:  'Welcome user, you are signed in.'
       admin:
         signed_in:  'Hello admin!'

 

    Devise mailer使用模式匹配创建主题信息

1
2
3
4
5
6
7
8
en:
   devise:
     mailer:
       confirmation_instructions:
         subject:  'Hello everybody!'
         user_subject:  'Hello User! Please confirm your email'
       reset_password_instructions:
         subject:  'Reset instructions'

 

本文出自 “晓风残月” 博客,请务必保留此出处http://kinda22.blog.51cto.com/2969503/1587991

分享至  

猜你喜欢

转载自wupengyu111.iteye.com/blog/2200073