Rails Single Sign On и SAML для нескольких организаций - PullRequest
0 голосов
/ 21 февраля 2019

Это больше вопрос о предложении, чем конкретный вопрос реализации.

В настоящее время для моего проекта Ruby on Rails я использую Devise для управления пользователями.У меня также есть модель Account такая, что каждый пользователь принадлежит учетной записи, а учетная запись имеет много пользователей.Учетная запись может рассматриваться как организация или компания, или, в основном, мой клиент.

У меня много учетных записей (т.е. много клиентов).Теперь один из них использует мой продукт вместе со многими другими веб-приложениями, разработанными ими или другими поставщиками.Этот клиент (учетная запись) желает разрешить единый вход для моего продукта и других продуктов от себя или других поставщиков.Я реализовал решение с использованием драгоценных камней Devise и Devise_Saml_Authenticatable с Okta в качестве поставщика удостоверений, и оно работает для этого одного клиента (учетной записи).

Однако в этой реализации все пользователи всех учетных записей должны сначала быть созданы в Okta, и при входе в систему им всем необходимо пройти через единый вход в Okta, и это не то, что мне нужно.Я хочу, чтобы пользователи учетных записей, которые не требуют единого входа, просто использовали знак по умолчанию на странице и входили в систему без необходимости что-либо делать с Okta.

Моя модель User выглядит следующим образом:

class User < ApplicationRecord
  rolify
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :rememberable, :trackable, :validatable, :recoverable, :timeoutable, :session_limitable, :saml_authenticatable

Мои маршруты, включающие devise и devise_saml_authenticatable, объявляются как:

devise_for :users, skip: [:sessions], и в результате получаются маршруты:

 new_user_password GET      /users/password/new(.:format)                            devise/passwords#new
                       edit_user_password GET      /users/password/edit(.:format)                           devise/passwords#edit
                            user_password PATCH    /users/password(.:format)                                devise/passwords#update
                                          PUT      /users/password(.:format)                                devise/passwords#update
                                          POST     /users/password(.:format)                                devise/passwords#create
                 cancel_user_registration GET      /users/cancel(.:format)                                  devise/registrations#cancel
                    new_user_registration GET      /users/sign_up(.:format)                                 devise/registrations#new
                   edit_user_registration GET      /users/edit(.:format)                                    devise/registrations#edit
                        user_registration PATCH    /users(.:format)                                         devise/registrations#update
                                          PUT      /users(.:format)                                         devise/registrations#update
                                          DELETE   /users(.:format)                                         devise/registrations#destroy
                                          POST     /users(.:format)                                         devise/registrations#create
                         new_user_session GET      /users/saml/sign_in(.:format)                            devise/saml_sessions#new
                             user_session POST     /users/saml/auth(.:format)                               devise/saml_sessions#create
                     destroy_user_session DELETE   /users/sign_out(.:format)                                devise/saml_sessions#destroy
                    metadata_user_session GET      /users/saml/metadata(.:format)                           devise/saml_sessions#metadata
                idp_sign_out_user_session GET|POST /users/saml/idp_sign_out(.:format)                       devise/saml_sessions#idp_sign_out
                                 new_user GET      /users/new(.:format)                                     users#new
                                edit_user GET      /users/:id/edit(.:format)                                users#edit
                                     user PATCH    /users/:id(.:format)                                     users#update
                                          PUT      /users/:id(.:format)                                     users#update

Обратите внимание, что я должен был сделать skip: [:sessions], потому что в противном случае я получил ошибку ArgumentError: Invalid route name, already in use: 'new_user_session' You may have defined two routes with the same name using the: as option, or you may be overriding a route already defined by a resource with the same naming.

Мой самый большой вопрос:

Предположим, у меня есть клиент(клиент A), которому требуется SSO для моего приложения и других приложений, управляемых только этим клиентом A, и есть другой клиент (клиент B), который хочет SSO для моего приложения и других приложений, управляемых только клиентом B, и другой клиент C, который делаетне хочет единого входа и хочет только старый метод Devise в методах;а также то, что клиенты не передают какую-либо информацию о пользователях между ними (я думаю, что это требует от клиентов A, B предоставлять своих собственных провайдеров идентификации).Есть ли способ сделать это?Обратите внимание, что для клиента C мои текущие маршруты сеансов devise не могут работать из-за ошибки конфликта выше.

Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2019

Вам понадобятся два отдельных потока входа.Обычно сайты имеют обычную форму входа, в которой также есть кнопка «Войти с помощью [вставить idp здесь]».Нажмите кнопку, отправляйтесь в idp, войдите в систему, отправьте обратно к определенной конечной точке saml, которая регистрирует вас локально, и вы уходите.

Все ваши пользователи увидят кнопку входа в saml, если вы не предоставите своему клиенту saml другую страницу входа для них, чтобы использовать их, но на самом деле нет проблем с этими кнопками, они теперь везде!Даже стек позволяет войти в систему с помощью Google.

...