{"id":20410,"date":"2024-11-19T15:29:10","date_gmt":"2024-11-19T07:29:10","guid":{"rendered":"https:\/\/fwq.ai\/blog\/20410\/"},"modified":"2024-11-19T15:29:10","modified_gmt":"2024-11-19T07:29:10","slug":"gitlab%e7%9a%84%e6%9d%83%e9%99%90%e7%ae%a1%e7%90%86%e5%92%8c%e5%8d%95%e7%82%b9%e7%99%bb%e5%bd%95%e9%9b%86%e6%88%90%e6%8a%80%e5%b7%a7","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/20410\/","title":{"rendered":"GitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/887\/227\/169785812651659.jpg\" class=\"aligncenter\" title=\"GitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7\u63d2\u56fe\" alt=\"GitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7\u63d2\u56fe\" \/><\/p>\n<p>GitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7\uff0c\u9700\u8981\u5177\u4f53\u4ee3\u7801\u793a\u4f8b<\/p>\n<p>\u6982\u8ff0\uff1a<\/p>\n<p>\u5728GitLab\u4e2d\uff0c\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\uff08SSO\uff09\u662f\u975e\u5e38\u91cd\u8981\u7684\u529f\u80fd\u3002\u6743\u9650\u7ba1\u7406\u53ef\u4ee5\u63a7\u5236\u7528\u6237\u5bf9\u4ee3\u7801\u4ed3\u5e93\u3001\u9879\u76ee\u548c\u5176\u4ed6\u8d44\u6e90\u7684\u8bbf\u95ee\u6743\u9650\uff0c\u800c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u53ef\u4ee5\u63d0\u4f9b\u66f4\u65b9\u4fbf\u7684\u7528\u6237\u8ba4\u8bc1\u548c\u6388\u6743\u65b9\u5f0f\u3002\u672c\u6587\u5c06\u4ecb\u7ecd\u5982\u4f55\u5728GitLab\u4e2d\u8fdb\u884c\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u3002<\/p>\n<p>\u4e00\u3001\u6743\u9650\u7ba1\u7406<\/p>\n<ol>\n<li>\u9879\u76ee\u8bbf\u95ee\u6743\u9650\u63a7\u5236<\/li>\n<\/ol>\n<p>\u5728GitLab\u4e2d\uff0c\u9879\u76ee\u53ef\u4ee5\u88ab\u8bbe\u7f6e\u4e3a\u79c1\u6709\uff08Private\uff09\u6216\u516c\u5f00\uff08Public\uff09\u3002\u79c1\u6709\u9879\u76ee\u53ea\u5141\u8bb8\u9879\u76ee\u6210\u5458\u8fdb\u884c\u8bbf\u95ee\uff0c\u800c\u516c\u5f00\u9879\u76ee\u5141\u8bb8\u6240\u6709\u4eba\u8fdb\u884c\u8bbf\u95ee\u3002\u901a\u8fc7\u8bbe\u7f6e\u4e0d\u540c\u7684\u6210\u5458\u89d2\u8272\uff0c\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63a7\u5236\u4e0d\u540c\u6210\u5458\u5bf9\u9879\u76ee\u7684\u6743\u9650\u3002\u4f8b\u5982\uff0c\u9879\u76ee\u6240\u6709\u8005\uff08Owner\uff09\u53ef\u4ee5\u5bf9\u9879\u76ee\u8fdb\u884c\u5b8c\u5168\u63a7\u5236\uff0c\u53ef\u4ee5\u6dfb\u52a0\u548c\u5220\u9664\u6210\u5458\uff0c\u5206\u914d\u89d2\u8272\u7b49\uff1b\u5f00\u53d1\u8005\uff08Developer\uff09\u53ef\u4ee5\u5bf9\u9879\u76ee\u8fdb\u884c\u4ee3\u7801\u4fee\u6539\u548c\u63d0\u4ea4\uff1b\u89c2\u5bdf\u8005\uff08Observer\uff09\u5219\u53ea\u80fd\u67e5\u770b\u9879\u76ee\u4f46\u4e0d\u80fd\u8fdb\u884c\u4efb\u4f55\u4fee\u6539\u3002<\/p>\n<p>\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n<pre># \u5c06\u7528\u6237\u6dfb\u52a0\u5230\u9879\u76ee\u4e2d\nPOST \/projects\/:id\/members\n{\n    \"user_id\": \"\u7528\u6237ID\",\n    \"access_level\": \"\u8bbf\u95ee\u7ea7\u522b\"\n}\n\n# \u8bbe\u7f6e\u9879\u76ee\u53ef\u89c1\u6027\nPUT \/projects\/:id\n{\n    \"visibility\": \"\u8bbf\u95ee\u7ea7\u522b\"\n}\n\n# \u5206\u914d\u89d2\u8272\nPUT \/projects\/:id\/members\/:user_id\n{\n    \"access_level\": \"\u8bbf\u95ee\u7ea7\u522b\"\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<ol>\n<li>\u7cfb\u7edf\u8bbf\u95ee\u6743\u9650\u63a7\u5236<\/li>\n<\/ol>\n<p>\u9664\u4e86\u9879\u76ee\u8bbf\u95ee\u6743\u9650\uff0cGitLab\u8fd8\u63d0\u4f9b\u4e86\u7cfb\u7edf\u8bbf\u95ee\u6743\u9650\u7684\u7ba1\u7406\u3002\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u63a7\u5236\u7528\u6237\u80fd\u5426\u6ce8\u518c\u65b0\u8d26\u53f7\u3001\u8bbf\u95ee\u7cfb\u7edf\u529f\u80fd\u548c\u4fee\u6539\u7cfb\u7edf\u8bbe\u7f6e\u7b49\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u7cfb\u7edf\u7ba1\u7406\u5458\u8d26\u53f7\u662fGitLab\u7cfb\u7edf\u7684\u6700\u9ad8\u6743\u9650\u7ea7\u522b\uff0c\u53ef\u4ee5\u5bf9\u6574\u4e2a\u7cfb\u7edf\u8fdb\u884c\u914d\u7f6e\u548c\u7ba1\u7406\u3002<\/p>\n<p>\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n<pre># \u521b\u5efa\u65b0\u7528\u6237\nPOST \/users\n{\n    \"email\": \"\u7528\u6237\u90ae\u7bb1\",\n    \"password\": \"\u7528\u6237\u5bc6\u7801\",\n    \"username\": \"\u7528\u6237\u540d\"\n}\n\n# \u4fee\u6539\u7cfb\u7edf\u8bbe\u7f6e\nPUT \/admin\/application\/settings\n{\n    \"signup_enabled\": false\n}\n\n# \u8bbe\u7f6e\u7528\u6237\u89d2\u8272\nPUT \/users\/:id\n{\n    \"admin\": true\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u4e8c\u3001\u5355\u70b9\u767b\u5f55\u96c6\u6210<\/p>\n<p>\u5355\u70b9\u767b\u5f55\uff08SSO\uff09\u662f\u4e00\u79cd\u8ba4\u8bc1\u65b9\u5f0f\uff0c\u5141\u8bb8\u7528\u6237\u4f7f\u7528\u4e00\u7ec4\u51ed\u8bc1\u767b\u5f55\u5404\u4e2a\u5e94\u7528\u7a0b\u5e8f\u3002\u5728GitLab\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u96c6\u6210\u5916\u90e8\u8eab\u4efd\u63d0\u4f9b\u5546\uff08\u5982LDAP\u3001Active Directory\u7b49\uff09\u6765\u5b9e\u73b0\u5355\u70b9\u767b\u5f55\u3002\u96c6\u6210SSO\u53ef\u4ee5\u63d0\u4f9b\u66f4\u65b9\u4fbf\u7684\u7528\u6237\u8ba4\u8bc1\u548c\u6388\u6743\u65b9\u5f0f\uff0c\u907f\u514d\u7528\u6237\u9700\u8981\u5355\u72ec\u767b\u5f55\u6bcf\u4e2a\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n<ol>\n<li>\u96c6\u6210LDAP SSO<\/li>\n<\/ol>\n<pre># \u5f00\u542fLDAP\u8ba4\u8bc1\nPUT \/admin\/application\/settings\n{\n    \"ldap_enabled\": true,\n    \"ldap_servers\": [\n        {\n            \"name\": \"LDAP\u670d\u52a1\u5668\u540d\u79f0\",\n            \"host\": \"LDAP\u670d\u52a1\u5668\u5730\u5740\",\n            \"port\": \"LDAP\u670d\u52a1\u5668\u7aef\u53e3\",\n            \"uid\": \"\u7528\u6237\u540d\u5c5e\u6027\",\n            \"bind_dn\": \"\u7ed1\u5b9a\u8d26\u53f7DN\",\n            \"password\": \"\u7ed1\u5b9a\u8d26\u53f7\u5bc6\u7801\",\n            \"encryption\": \"\u52a0\u5bc6\u65b9\u5f0f\"\n        }\n    ]\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<ol>\n<li>\u96c6\u6210OmniAuth SSO<\/li>\n<\/ol>\n<pre># \u914d\u7f6eOmniAuth\nPUT \/admin\/application\/settings\n{\n    \"omniauth_enabled\": true,\n    \"omniauth_providers\": [\n        {\n            \"name\": \"\u63d0\u4f9b\u5546\u540d\u79f0\",\n            \"enabled\": true,\n            \"app_id\": \"\u5e94\u7528\u7a0b\u5e8fID\",\n            \"app_secret\": \"\u5e94\u7528\u7a0b\u5e8f\u5bc6\u94a5\"\n        }\n    ]\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u603b\u7ed3\uff1a<\/p>\n<p>\u672c\u6587\u4ecb\u7ecd\u4e86GitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7\uff0c\u5e76\u63d0\u4f9b\u4e86\u76f8\u5173\u7684\u4ee3\u7801\u793a\u4f8b\u3002\u901a\u8fc7\u5408\u7406\u8bbe\u7f6e\u9879\u76ee\u548c\u7cfb\u7edf\u8bbf\u95ee\u6743\u9650\uff0c\u53ef\u4ee5\u786e\u4fdd\u7528\u6237\u5bf9GitLab\u4e2d\u5404\u9879\u8d44\u6e90\u7684\u5408\u7406\u8bbf\u95ee\u548c\u7ba1\u7406\u3002\u540c\u65f6\uff0c\u901a\u8fc7\u96c6\u6210\u5916\u90e8\u8eab\u4efd\u63d0\u4f9b\u5546\uff0c\u53ef\u4ee5\u63d0\u4f9b\u66f4\u65b9\u4fbf\u7684\u7528\u6237\u8ba4\u8bc1\u548c\u6388\u6743\u65b9\u5f0f\u3002\u5e0c\u671b\u672c\u6587\u80fd\u591f\u5e2e\u52a9\u8bfb\u8005\u66f4\u597d\u5730\u4f7f\u7528GitLab\u8fdb\u884c\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u3002<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662fGitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GitLab\u7684\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u6280\u5de7\uff0c\u9700\u8981\u5177\u4f53\u4ee3\u7801\u793a\u4f8b \u6982\u8ff0\uff1a \u5728GitLab\u4e2d\uff0c\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\uff08SSO\uff09\u662f\u975e\u5e38\u91cd\u8981\u7684\u529f\u80fd\u3002\u6743\u9650\u7ba1\u7406\u53ef\u4ee5\u63a7\u5236\u7528\u6237\u5bf9\u4ee3\u7801\u4ed3\u5e93\u3001\u9879\u76ee\u548c\u5176\u4ed6\u8d44\u6e90\u7684\u8bbf\u95ee\u6743\u9650\uff0c\u800c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u53ef\u4ee5\u63d0\u4f9b\u66f4\u65b9\u4fbf\u7684\u7528\u6237\u8ba4\u8bc1\u548c\u6388\u6743\u65b9\u5f0f\u3002\u672c\u6587\u5c06\u4ecb\u7ecd\u5982\u4f55\u5728GitLab\u4e2d\u8fdb\u884c\u6743\u9650\u7ba1\u7406\u548c\u5355\u70b9\u767b\u5f55\u96c6\u6210\u3002 \u4e00\u3001\u6743\u9650\u7ba1\u7406 \u9879\u76ee\u8bbf\u95ee\u6743\u9650\u63a7\u5236 \u5728GitLab\u4e2d\uff0c\u9879\u76ee\u53ef\u4ee5\u88ab\u8bbe\u7f6e\u4e3a\u79c1\u6709\uff08Private\uff09\u6216\u516c\u5f00\uff08Public\uff09\u3002\u79c1\u6709\u9879\u76ee\u53ea\u5141\u8bb8\u9879\u76ee\u6210\u5458\u8fdb\u884c\u8bbf\u95ee\uff0c\u800c\u516c\u5f00\u9879\u76ee\u5141\u8bb8\u6240\u6709\u4eba\u8fdb\u884c\u8bbf\u95ee\u3002\u901a\u8fc7\u8bbe\u7f6e\u4e0d\u540c\u7684\u6210\u5458\u89d2\u8272\uff0c\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63a7\u5236\u4e0d\u540c\u6210\u5458\u5bf9\u9879\u76ee\u7684\u6743\u9650\u3002\u4f8b\u5982\uff0c\u9879\u76ee\u6240\u6709\u8005\uff08Owner\uff09\u53ef\u4ee5\u5bf9\u9879\u76ee\u8fdb\u884c\u5b8c\u5168\u63a7\u5236\uff0c\u53ef\u4ee5\u6dfb\u52a0\u548c\u5220\u9664\u6210\u5458\uff0c\u5206\u914d\u89d2\u8272\u7b49\uff1b\u5f00\u53d1\u8005\uff08Developer\uff09\u53ef\u4ee5\u5bf9\u9879\u76ee\u8fdb\u884c\u4ee3\u7801\u4fee\u6539\u548c\u63d0\u4ea4\uff1b\u89c2\u5bdf\u8005\uff08Observer\uff09\u5219\u53ea\u80fd\u67e5\u770b\u9879\u76ee\u4f46\u4e0d\u80fd\u8fdb\u884c\u4efb\u4f55\u4fee\u6539\u3002 \u793a\u4f8b\u4ee3\u7801\uff1a # \u5c06\u7528\u6237\u6dfb\u52a0\u5230\u9879\u76ee\u4e2d POST \/projects\/:id\/members { &#8220;user_id&#8221;: &#8220;\u7528\u6237ID&#8221;, &#8220;access_level&#8221;: &#8220;\u8bbf\u95ee\u7ea7\u522b&#8221; } # \u8bbe\u7f6e\u9879\u76ee\u53ef\u89c1\u6027 PUT \/projects\/:id { &#8220;visibility&#8221;: &#8220;\u8bbf\u95ee\u7ea7\u522b&#8221; } # \u5206\u914d\u89d2\u8272 PUT \/projects\/:id\/members\/:user_id { &#8220;access_level&#8221;: &#8220;\u8bbf\u95ee\u7ea7\u522b&#8221; } \u767b\u5f55\u540e\u590d\u5236 \u7cfb\u7edf\u8bbf\u95ee\u6743\u9650\u63a7\u5236 \u9664\u4e86\u9879\u76ee\u8bbf\u95ee\u6743\u9650\uff0cGitLab\u8fd8\u63d0\u4f9b\u4e86\u7cfb\u7edf\u8bbf\u95ee\u6743\u9650\u7684\u7ba1\u7406\u3002\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u63a7\u5236\u7528\u6237\u80fd\u5426\u6ce8\u518c\u65b0\u8d26\u53f7\u3001\u8bbf\u95ee\u7cfb\u7edf\u529f\u80fd\u548c\u4fee\u6539\u7cfb\u7edf\u8bbe\u7f6e\u7b49\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u7cfb\u7edf\u7ba1\u7406\u5458\u8d26\u53f7\u662fGitLab\u7cfb\u7edf\u7684\u6700\u9ad8\u6743\u9650\u7ea7\u522b\uff0c\u53ef\u4ee5\u5bf9\u6574\u4e2a\u7cfb\u7edf\u8fdb\u884c\u914d\u7f6e\u548c\u7ba1\u7406\u3002 \u793a\u4f8b\u4ee3\u7801\uff1a # \u521b\u5efa\u65b0\u7528\u6237 POST \/users { &#8220;email&#8221;: &#8220;\u7528\u6237\u90ae\u7bb1&#8221;, &#8220;password&#8221;: &#8220;\u7528\u6237\u5bc6\u7801&#8221;, &#8220;username&#8221;: &#8220;\u7528\u6237\u540d&#8221; } # \u4fee\u6539\u7cfb\u7edf\u8bbe\u7f6e PUT \/admin\/application\/settings { &#8220;signup_enabled&#8221;: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-20410","post","type-post","status-publish","format-standard","hentry","category-16"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/20410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=20410"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/20410\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=20410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=20410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=20410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}