Это больше вопрос о предложении, чем конкретный вопрос реализации.
В настоящее время для моего проекта 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 не могут работать из-за ошибки конфликта выше.
Спасибо!