Gitlab社区版支持多LDAP登录
安装配置Gitlab社区版的时候发现Gitlab支持多LDAP配置,配置完成后发现登录页面还是只有一个登录选项。翻阅官方文档才发现社区版原来不支持多LDAP登录。业务方还是想要多LDAP登录支持,抛来一篇文章:https://segmentfault.com/a/1190000016340093。网友的解决方案
看看文章中的修改方案,改动的文件是:/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/gitlab_omniauth-ldap-1.2.1/lib/omniauth/strategies/ldap.rb def callback_phase #一个ldap相关信息 @options.host="" @options.password="" @options.bind_dn="" @adaptor = OmniAuth::LDAP::Adaptor.new @options return fail!(:missing_credentials) if missing_credentials? begin @ldap_user_info = @adaptor.bind_as(:filter => filter(@adaptor), :size => 1, :password => request["password"]) #增加修改第二个ldap域认证支持 if !@ldap_user_info @options.host="" @options.password="" @options.bind_dn="" @adaptor = OmniAuth::LDAP::Adaptor.new @options @ldap_user_info = @adaptor.bind_as(:filter => filter(@adaptor), :size => 1, :password => request["password"]) end return fail!(:invalid_credentials) if !@ldap_user_info @user_info = self.class.map_user(@@config, @ldap_user_info) super rescue Exception => e return fail!(:ldap_error, e) end end
这个是LDAP登录页的登录callback,作者在这里通过硬编码方案加上了第二个LDAP登录配置,同时还修改了另外一个地方:
然而好事多磨,验证的时候仍然报了AccessDenied,继续跟踪,发现是在是否blockuser时也多ldap进行了判断,如果user在ldap中不存在,则会进行block处理,故这块也需要增加多域调整,对应文件如下:/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/ldap/access.rb,修改后再次认证终于通过了!
作者方案中第二个LDAP更多的类似一个备用配置,如果两个LDAP用户出现冲突了,第二个LDAP的同名用户就永远登录不了了。寻找新的方案
看完这个方案,总觉得有些不太满意,还得找一找优雅的方案。
看代码吧,虽然不会ruby,但老外的代码实现得一般还是很优雅的,读一读改一改还是问题不大的。
很快找到了这个文件:/opt/gitlab/embedded/service/gitlab-rails/app/views/devise/shared/_signin_box.html.haml,是登录框的页面模版:- if any_form_based_providers_enabled? - if crowd_enabled? .login-box.tab-pane{ id: "crowd", role: "tabpanel", class: active_when(form_based_auth_provider_has_active_class?(:crowd)) } .login-body = render "devise/sessions/new_crowd" = render_if_exists "devise/sessions/new_kerberos_tab" # 支持多LDAP登录 - ldap_servers.each_with_index do |server, i| .login-box.tab-pane{ id: "#{server["provider_name"]}", role: "tabpanel", class: active_when(i == 0 && form_based_auth_provider_has_active_class?(:ldapmain)) } .login-body = render "devise/sessions/new_ldap", server: server = render_if_exists "devise/sessions/new_smartcard" # 这个地方可以关闭默认登录 - if password_authentication_enabled_for_web? .login-box.tab-pane{ id: "login-pane", role: "tabpanel" } .login-body = render "devise/sessions/new_base" - elsif password_authentication_enabled_for_web? .login-box.tab-pane.active{ id: "login-pane", role: "tabpanel" } .login-body = render "devise/sessions/new_base"
从页面中可以发现代码中对多LDAP登录没有限制,然后查看一下生成的配置文件,多LDAP也都在配置文件中,都没有问题。
只能继续跟踪一下ldap_servers的相关实现,最后找到两个文件:/opt/gitlab/embedded/service/gitlab-rails/app/controllers/concerns/renders_ldap_servers.rb和/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/auth/ldap/config.rb。
我们先看看第一个文件renders_ldap_servers.rb:# frozen_string_literal: true module RendersLdapServers extend ActiveSupport::Concern included do helper_method :ldap_servers end def ldap_servers @ldap_servers ||= begin if Gitlab::Auth::Ldap::Config.sign_in_enabled? Gitlab::Auth::Ldap::Config.available_servers else [] end end end end
代码很简单,如果sign_in_enabled,就返回配置的available_servers。Ldap::Config代码就在第二个文件config.rb中,截取相关代码如下: def self.enabled? Gitlab.config.ldap.enabled end def self.sign_in_enabled? enabled? && !prevent_ldap_sign_in? end def self.prevent_ldap_sign_in? Gitlab.config.ldap.prevent_ldap_sign_in end def self.servers Gitlab.config.ldap.servers&.values || [] end def self.available_servers return [] unless enabled? _available_servers end def self._available_servers Array.wrap(servers.first) end
在这个代码中我们找到了多LDAP登录限制的"罪魁祸首"——Array.wrap(servers.first)——通过这行代码选取了多个LDAP配置中的第一个,简单的修改此处即可优雅的解锁gitlab社区版的多LDAP支持。优雅的解决方案
最终解决方案记录如下:
修改/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/auth/ldap/config.rb文件:# 搜索_available_servers,找到这个地方,修改如下即可 def self._available_servers #Array.wrap(servers.first) servers end
修改后重启一下gitlab即可。
洗碗机洗碗和人工工洗碗,哪个更省心?1。水电成本洗碗机洗碗和人工洗碗差不多。2。人工费像大型餐饮,星级酒店等洗碗工都得好几个,而且还不好招工,如果用洗碗机,用人数量减少一半,人工成本会节省很多。3。餐具损耗人工洗碗时
好物推荐南卡A2ANC降噪耳机百元性价比之选本次产品为厂家送测,感谢南卡的大力支持!提到南卡,我们首先想到的应该是南卡家的骨传导蓝牙耳机,不过这次,南卡也是推出了新产品南卡A2,这是南卡首款主动降噪的产品,而能上我的好物推荐
好物推荐漫步者W820NB头戴式耳机没有人比我更懂降噪漫步者这个品牌,近些年可以说是蓝牙耳机领域的一匹黑马了,但是却很少有人知道漫步者已经做了20多年的声学领域了,甚至还是一个上市公司,而他们是做音箱起家的,之后我们有机会也可以去介绍
南卡T2蓝牙耳机评测开箱评测南卡T2蓝牙耳机双动力好音质南卡今年出了很多新品,有不用耳朵听音乐的骨传导CC,有圆滑的半入耳式LitePro,有带主动降噪ANC的A1,可以说每一款耳机都有着自己的特点和
开箱评测SanagA7S气传导耳机新技术新方向本产品为厂家送测,感谢Sanag的大力支持!Sanag虽然是英国品牌,但如今在国内市场也是频频发力,甚至请了花样滑冰世界冠军于小雨做形象大使,可见其品牌对国内市场的重视程度,而一向
自动洗碗机常见功能及优势随着生活条件的提高,洗碗机逐渐被家庭餐饮行业接受和使用,越来越多的家用洗碗机和商用用洗碗机都进入了成千上万的家庭后厨,解决用餐后洗碗的问题。商用洗碗机,通常是商业目的,用于餐厅,食
洗碗机带烘干功能的优势对于一些需要洗很多餐具的洗碗间来说,要操作方便,节省成本,而且还确保餐具卫生安全,还有一个关键的配置不能少,这是干燥系统!聪明的用户可以在购买洗碗机选择干式的功能,或洗碗机烘干系统
如何看待全红婵对游戏防沉迷认证感到为难,称每天只能打1小时?尊重少年人天性,别让鲁迅的后悔重演。风筝北京的冬季,地上还有积雪,灰黑色的秃树枝丫叉于晴朗的天空中,而远处有一二风筝浮动,在我是一种惊异和悲哀。故乡的风筝时节,是春二月,倘听到沙沙
自动洗碗机的功能及优点随着生活条件的改善,洗碗机逐渐被家庭和餐饮业所接受和使用。越来越多的家用洗碗机和商用洗碗机进入千家万户和厨房,解决饭后洗碗的问题。商用洗碗机,通常用于商业用途,用于餐馆食堂宾馆等餐
商用自动洗碗机的功能介绍洗碗机是一种自动清洗碗筷盘子碟子刀叉等餐具的装置。市场上的全自动洗碗机可分为家用和商用两种。家用全自动洗碗机只适合家庭使用,主要有柜式台式水槽一体式和一体式。商用洗碗机按结构可分为
比亚迪汉DM到店实拍,推荐购买四驱性能版豪华型比亚迪今年的重磅车型应该要说汉系列。车型有两种动力总成,分别是插电混动(汉DM)和纯电版(汉EV)。今天我们实拍是刚刚到店的汉DM车型,实拍为四驱性能版豪华型21。98万元,另外还