#ruby-on-rails #devise #single-sign-on #saml #onelogin
#ruby-on-rails #разработка #единый вход #saml #onelogin
Вопрос:
Для моего проекта Ruby on Rails у меня есть модель Account
и model User
. User
принадлежит account
и account
имеет много users
.
Для некоторых учетных записей я хочу разрешить пользователям использовать обычные маршруты Devise (т. Е. Маршруты, контролируемые контроллером devise / sessions). Для некоторых других учетных записей я хочу разрешить пользователям использовать SAML / SSO для входа.
Я успешно реализовал это с помощью gems Devise
и devise_saml_authenticatable
. Пользователи в своих учетных записях могут входить в систему, используя любой маршрут, в зависимости от того, используют ли их учетные записи SAML / SSO. Я использую Onelogin в качестве своего поставщика удостоверений.
Однако для выхода из системы. Я хочу, чтобы пользователи, чья учетная запись не использует SAML / SSO, выходили из системы через
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
.
С помощью этого я могу легко просто поместить =link_to 'Logout', destroy_user_session_path, method: :delete
С другой стороны, я хочу, чтобы пользователи, чья учетная запись использует SAML / SSO, выходили из системы через SLO-путь поставщика удостоверений. Для одной из таких учетных записей я пытался
= link_to "Logout", 'https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy'
https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy является ли ссылка SLO из Onelogin
Другим аспектом моего проекта является то, что пользователи, чья учетная запись использует SAML / SSO, также могут входить в систему, используя обычные маршруты входа devise. Так что это их выбор — использовать либо единый вход, либо разработать маршруты для входа.
Если они вошли в систему с помощью devise routes, я хочу, чтобы они вышли через destroy_user_session_path
. Если они вошли в систему с помощью единого входа, я хочу, чтобы они вышли через https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy
Есть ли способ определить, был ли выполнен вход в текущий сеанс с использованием SAML / единого входа, чтобы я мог сделать
if signed_in_with_sso
= link_to 'Log out', https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy
else
= link_to 'Log out', destroy_user_session_path, method: :delete
Я не хочу создавать столбец в моей таблице users, чтобы записывать, вошли ли они в систему через SAML / SSO, или просто разрабатывать каждый раз, когда они входят в систему. Другими словами, никаких миграций.
Спасибо!
Комментарии:
1. Просто мысль, но можете ли вы вставить что-нибудь в
session
?
Ответ №1:
Я вижу два потенциальных варианта: либо в момент аутентификации вы устанавливаете что-то в сеансе, указывающее тип аутентификации. Вы можете управлять поведением аутентификации на основе этого.
Или, возможно, вы могли бы отправить запрос SAML с isPassive = true к IdP, который вернет ответ SAML, если у пользователя есть действительный сеанс с IdP. Затем вы могли бы управлять своим поведением при выходе из системы на основе этого ответа.