针对多个组织的Rails单一登录和SAML

时间 2019-02-21
阅读 40
点赞 0
收藏 0
连接jl118

这更多的是一个建议问题,而不是一个具体的实现问题。

目前,对于我的RubyonRails项目,我使用Designe来管理用户。我还有一个模特Account这样,每个用户都属于一个帐户,一个帐户有许多用户。一个帐户可以被认为是一个组织或公司,或者基本上是我的一个客户。

我有许多账户(即许多客户)。现在他们中的一个将我的产品与许多其他由他们自己或其他供应商开发的Web应用程序一起使用。该客户(帐户)希望允许对我的产品以及他们自己或其他供应商提供的其他产品进行单一登录。我已经实现了一个使用design和designe-saml-u认证gems的解决方案,Okta作为身份提供者,它为一个客户(帐户)工作。

但是,有了这个实现,所有帐户的所有用户都必须首先在OKTA上创建,当他们登录时,他们都需要通过OKTA的单一登录过程,这不是我想要的。我希望不需要SSO的帐户的用户只使用默认登录页并登录,而不必对OKTA做任何操作。

我的用户模型如下:

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_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作为option, or you may be overriding a route already defined by a resource with the same naming.

我最大的问题是:

假设我有一个客户(客户A)希望在我的应用程序上使用SSO,而其他客户(客户B)希望在我的应用程序上使用SSO,其他应用程序仅由客户B管理,而另一个客户C不希望使用SSO,只希望使用旧的设计登录方法;而且客户不共享e两者之间的任何用户信息(我认为这需要客户A、B提供自己的身份提供者)。有办法吗?请注意,对于客户C,由于上述冲突错误,我当前的设计会话路由无法工作。

谢谢!

建议答案

您需要两个单独的登录流。通常,网站会有一个普通的登录表单,其中也有一个“用[在此处插入IDP]登录”按钮。单击按钮,转到IDP,登录,返回到一个特定的SAML端点,该端点将您在本地登录,然后离开。

您的所有用户都将看到SAML登录按钮,除非您为您的SAML客户提供一个不同的登录页面供他们使用,但这些按钮确实没有问题,它们现在无处不在!即使是栈也可以让你用谷歌登录。

👍 0