1

如果我有omniauth 允许用户使用诸​​如facebook/twitter 之类的提供程序登录,我如何检查current_user 是否使用omniauth 登录?

我希望仅当 current_user 通过omniauth 登录时才允许代码运行。

这是我的架构的外观

create_table "users", :force => true do |t|
    t.string    "name"
    t.string    "email"
    t.timestamp "created_at",                         :null => false
    t.timestamp "updated_at",                         :null => false
    t.string    "password_digest"
    t.string    "remember_token"

  end

 create_table "authentications", :force => true do |t|
    t.integer  "user_id"
    t.string   "provider"
    t.string   "uid"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.string   "secret"
    t.string   "token"
  end

控制器

    class PostsController < ApplicationController
    def create
      @post = current_user.posts.build(params[:post])

      if @post.save
        if @post.check
          UserMailer.check_email(@user).deliver
        else
          flash[:success] = "Posted"
          Twitter::Client.new.update(@post.content) if logged_using_omniauth? request != nil
        end
        redirect_to root_path
      else
        @feed_items = []
        render 'static_pages/home'
      end
    end
4

2 回答 2

6

我建议维护一个会话以检查其是否通过omniauth 登录。

在 OmniauthCallbacksController

def method_name
 .......
 #if logged in set the session
 session[:logged_in_using_omniauth] = true
 .......
end

在应用程序控制器中

def logged_in_using_omniauth?
  session[:logged_in_using_omniauth].present?
end

并通过以下方式将该方法公开为辅助方法:

helper_method :logged_in_using_omniauth?

现在logged_in_using_omniauth?在控制器或视图中的任何地方使用

于 2014-06-19T07:38:51.343 回答
2

您可以通过以下方式验证它:

def logged_using_omniauth? request
  res = nil
  omniauth = request.env["omniauth.auth"]
  res = Authentication.find_by_provider_and_uid ↵  
  (omniauth['provider'], omniauth['uid']) if omniauth
  res  
end

如果返回authentication的不是nil,那么他们使用omniauth 登录。

于 2013-04-11T17:54:13.323 回答