我正在开发一个应用程序,该应用程序利用我的用户记录和omniauth设计用户所拥有的记录,而不是使用典型的omniauth + devise用户记录。我试图将设计用户身份验证添加到omniauth路由/auth/:provider
,以便未注册的访问者无法访问这些路由并触发特定提供商的身份验证过程。
我已经能够通过在我的会话控制器中使用设计的authenticate_user!
帮助程序方法为回调添加身份验证,因此我至少可以阻止未注册的访问者能够从omniauth流创建记录,但我希望设计用户auth在omniauth流的所有阶段工作。
有关如何将设计用户身份验证添加到初始omniauth路由的任何想法,无论是使用与我当前解决方案类似的东西,还是使用我的routes.rb文件,使用设计authenticate :user do
?
答案 0 :(得分:0)
此解决方案对我有用。实际上,它会创建一条新路由,以检查用户当前是否已登录,然后将其重定向到所请求提供者的授权路径。
routes.rb:
scope module: :authentication do
devise_scope :user do
# ...
get 'users/auth/:provider/setup', to: 'omniauth_callbacks#before_request_phase'
end
# ...
end
omniauth_callbacks_controller.rb:
def before_request_phase
authorize_path = send("user_#{params[:provider]}_omniauth_authorize_path".to_s)
if current_user.present?
redirect_to(authorize_path)
else
redirect_to login_path(return_to: authorize_path)
end
end
答案 1 :(得分:0)
针对任何遇到相同问题的人的解决方案:
在request_phase中进行Devise身份验证。如果您使用的是策略工具,例如omniauth-facebook,则可以在初始化程序中(例如,在config/initializers/omniauth.rb
中用猴子修补该特定策略:
module FacebookExtension
include Devise::Controllers::Helpers
def request_phase
# it might be 'admin_user_signed_in?' depends on what your user model is
if user_signed_in?
super
else
# redirect to any path you think is suitable once devise authentication fail
redirect Rails.application.routes.url_helpers.new_admin_user_session_path
end
end
end
OmniAuth::Strategies::Facebook.prepend FacebookExtension
答案 2 :(得分:-1)
在应用程序控制器中添加设计autheticate_user!
。
或者使用before filter
在omniauth身份验证方法之前调用它。