Gitlab和omniauth-pam身份validation

基本上我按照这些说明添加自定义omniauth提供程序:

https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md#using-custom-omniauth-providers

我想使用omniauth-pam:

https://github.com/nickcharlton/omniauth-pam

添加gem并在gitlab.yml中配置后:

providers: - { name: 'pam' } 

它不会再出现此错误:

 Received wrong number of arguments. [nil, nil] (ArgumentError) /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/omniauth-1.1.4/lib/omniauth/strategy.rb:143:in `initialize' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_dispatch/middleware/stack.rb:43:in `new' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_dispatch/middleware/stack.rb:43:in `build' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_dispatch/middleware/stack.rb:113:in `block in build' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_dispatch/middleware/stack.rb:113:in `each' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_dispatch/middleware/stack.rb:113:in `inject' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.15/lib/action_dispatch/middleware/stack.rb:113:in `build' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/engine.rb:475:in `app' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/application/finisher.rb:31:in `block in ' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/initializable.rb:30:in `instance_exec' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/initializable.rb:30:in `run' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/initializable.rb:55:in `block in run_initializers' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/initializable.rb:54:in `each' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/initializable.rb:54:in `run_initializers' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/application.rb:136:in `initialize!' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/railties-3.2.15/lib/rails/railtie/configurable.rb:30:in `method_missing' /sync1/gitlab/config/environment.rb:5:in `' config.ru:3:in `require' config.ru:3:in `block in ' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/builder.rb:51:in `instance_eval' /sync1/gitlab/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/builder.rb:51:in `initialize' config.ru:1:in `new' config.ru:1:in `' /usr/local/lib64/ruby/gems/2.0.0/gems/passenger-4.0.23/helper-scripts/rack-preloader.rb:105:in `eval' /usr/local/lib64/ruby/gems/2.0.0/gems/passenger-4.0.23/helper-scripts/rack-preloader.rb:105:in `preload_app' /usr/local/lib64/ruby/gems/2.0.0/gems/passenger-4.0.23/helper-scripts/rack-preloader.rb:150:in `' /usr/local/lib64/ruby/gems/2.0.0/gems/passenger-4.0.23/helper-scripts/rack-preloader.rb:29:in `' /usr/local/lib64/ruby/gems/2.0.0/gems/passenger-4.0.23/helper-scripts/rack-preloader.rb:28:in `' 

omn​​iauth-pam的文档声明它不需要任何配置参数。 所以这个错误对我来说无法解释。

问题来自于config/initializers/devise.rb如何设置config/gitlab.yml定义的提供程序(通过始终传递至少两个参数,即使它们是nil )以及omniauth/strategy.rb (如何从任何提供者那里) ‘pam’inheritance)处理给定的参数(通过检查提供者声明的参数是否与传递的参数数相匹配)。

这种组合使得它期望在config/gitlab.yml定义的提供者至少声明两个参数。

所以我必须在我的提供商中执行以下操作来解决此问题:

 require 'omniauth' module OmniAuth module Strategies class YourProvider include OmniAuth::Strategy args [:arg1, :arg2] # <-- This is the line you need. 

这很可能是gitlab中的一个错误,但上面是我的解决方法。

您可以通过分配omniauth-pam项目并将该行添加到lib/omniauth/strategies/pam.rb

然后在gitlab Gemfile ,你的gem行应该如下所示:

 gem 'omniauth-pam', :git => 'https://github.com/vanthome/omniauth-pam.git' 

这样,它将使用提供程序进行更改。 之后, 使用自定义提供程序时的其余说明仍然适用。

编辑:

我刚刚意识到还有另一种解决方法,不需要你分叉提供者代码。

config/initializers/devise.rb ,在最外面的块的末尾添加以下行:

 config.omniauth :pam 

并从config/gitlab.yml删除添加的提供程序行。

我建议你检查这个人做了什么:

https://github.com/raphendyr/gitlabhq/tree/pam

当我使用他的存储库来托管GitLab时,它的工作非常好。

它有点过时了,但是对于当前版本制作相同的补丁并不是一个大问题,如果这对你来说是个问题。

我必须让这个为我的大学工作。 看看我对Gitlab的拉取请求。 我能够在Ubuntu上使用PAM获得Gitlab的工作版本。

Gitlab拉请求#4706