我正在努力設置Ruby on Rails,ActiveAdmin應用程序使用Devise進行身份驗證。我正在使用Azure AD strategy進行omniauth策略。如何在Azure上使用SSO設置RoR應用程序
我已經加入omniauth策略config/initializers/devise.rb
:
config.omniauth :azure_activedirectory, 'app id', 'azure tenant id'
新增的Users::OmniauthCallbacksContoller
:
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def azure_activedirectory
@user = AdminUser.from_omniauth(request.env['omniauth.auth'])
if @user.persisted?
sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
set_flash_message(:notice, :success, :kind => 'azure_activedirectory') if is_navigational_format?
else
session['devise.azure_activedirectory_data'] = request.env['omniauth.auth']
redirect_to new_admin_user_registration_url
end
end
def failure
redirect_to root_path
end
end
,並添加回調路線routes.rb
:
Rails.application.routes.draw do
devise_config = ActiveAdmin::Devise.config
devise_config[:controllers][:omniauth_callbacks] = 'users/omniauth_callbacks'
devise_for :admin_users, devise_config
devise_scope :admin_user do
get 'sign_in', :to => 'devise/sign_in', as: :new_admin_user_session
get 'sign_out', :to => 'devise/sign_out', :as => :destroy_admin_user_session
end
ActiveAdmin.routes(self)
root to: redirect('/admin')
end
新增的from_omniauth
方法models/admin_user
:
class AdminUser < ActiveRecord::Base
devise :trackable, :omniauthable, omniauth_providers: [:azure_activedirectory]
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
end
end
end
但這一切,當我運行該應用程序我得到的是錯誤:The action 'sign_in' could not be found for Users::OmniauthCallbacksController
我在結束了,我不知道還有什麼我必須做的就是它的工作。 https://github.com/AzureAD/omniauth-azure-activedirectory和https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview對於我如何修復它不再顯示任何線索。
任何人都可以幫我解決我做錯的事嗎?
感謝您嘗試幫助。太糟糕了,雖然這解決了錯誤,但引入了一個新問題:我從'/'重定向到'/ admin',反之亦然。 –
@MichaelSommer我編輯了我的答案,試圖解決你的問題,希望現在適合你。 –
當我刪除'root to:'人們不會被重定向到'/ admin',我不希望我的用戶自己知道。我的根有一個api的入口,它使用了守望者而不是設計。 –