рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдВ

рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╛рдзрд╛рди gitosys, gitolite, mercurial-server рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпреЗ рд╕рдорд╛рдзрд╛рди SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдПрдХ рдХреБрдВрдЬреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдирд╣реАрдВ рд╣реИред

рдмреБрдирд┐рдпрд╛рджреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ:


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдИ ...


рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЕрдиреБрд░реЛрдз рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдЗрдХрдЯреНрдареЗ nginx
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛:
 рд╕рд░реНрд╡рд░ {
 ...

     рд╕реНрдерд╛рди = / рд╕рд╛рдорд╛рдиреНрдп {
         / etc / nginx / uwsgi_params рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ;
         uwsgi_pass unix: /tmp/uwsgi.sock;
     }

     рд╕реНрдерд╛рди / hg {
         $ рдкрд░рд┐рдпреЛрдЬрдирд╛ "" рд╕реЗрдЯ рдХрд░реЗрдВ;
         if ($ uri ~ "^ / hg / ([a-zA-Z0-9 _ \ -] +)ред * $") {
             $ $ $ 1 рд╕реЗрдЯ рдХрд░реЗрдВ;
         }
         рдЕрдЧрд░ ($ рдкрд░рд┐рдпреЛрдЬрдирд╛ = "") {
             рд╡рд╛рдкрд╕реА 403;
         }
         рдЕрдЧрд░ (-d / var / рдкреНрд░реЛрдЬреЗрдХреНрдЯ / $ рд░реЗрдкреЛ) {
             рд╡рд╛рдкрд╕реА 404;
         }
         рдУрдЯрд░_рд░реЗрдХреНрд╕реНрдЯ / рдСрд░реНрдЯ;
         / etc / nginx /xy_params рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ;
         xy_redirect рдмрдВрдж;
         рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://127.0.0.1:8002;
     }
 }

127.0.0.1:8002 - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдкрддреЗ рдкрд░ hgerve рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рд╕рднреА рдЬрд╛рджреВ uwsgi рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп nginx рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдФрд░ рдЪреЗрдХ (200,401,403) рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░реЗрдВред

#!/usr/bin/python # configure db_host = 'localhost' db_name = 'authdb' db_user = 'test' db_pass = 'test' role_id_read = 1 # member role_id_write = 2 # developer # import re import os import base64 import MySQLdb db_conn = MySQLdb.connect(host = db_host, user = db_user, passwd = db_pass, db = db_name) def get_project_info(project_name): global db_conn cursor = db_conn.cursor() query = 'SELECT id,is_private FROM projects WHERE name=%s' cursor.execute(query, (project_name, )) row = cursor.fetchone() cursor.close() return row def get_role_id(project_id, username, password): global db_conn cursor = db_conn.cursor() query = 'SELECT id FROM users WHERE name=%s AND pass=sha1(%s)' cursor.execute(query, (username, password, )) row = cursor.fetchone() if row == None: return -1 user_id = row[0] query = 'SELECT role_id FROM project_user_perm WHERE project_id=%s AND user_id=%s' cursor.execute(query, (project_id, user_id, )) row = cursor.fetchone() cursor.close() if row == None: return 0 return row[0] def can_user_read(project_id, username, password): role_id = get_role_id(project_id, username, password) if role_id == -1: return -1 if role_id == role_id_read or role_id == role_id_write : return 1 return 0 def can_user_write(project_id, username, password): role_id = get_role_id(project_id, username, password) if role_id == -1: return -1 if role_id == role_id_write : return 1 return 0 def ok200(callback): callback('200 OK', []) return [] def err401(callback): callback('401 Unauthorized', [('WWW-Authenticate', 'Basic realm="Restrict"')]) return [] def err403(callback): callback('403 Forbidden', []) return [] def application(env, resp): req_uri = env.get('REQUEST_URI', '') m = re.match('^/(\w+)/(\w+).*$', req_uri) if m == None: return err403(resp) project_name = m.group(2) project_info = get_project_info(project_name) if project_info == None: return err403(resp) req_method = env.get('REQUEST_METHOD', '') if req_method == 'GET' and project_info[1] == 0: return ok200(resp) req_http_auth = env.get('HTTP_AUTHORIZATION', '') if req_http_auth == '': return err401(resp) m = re.match('^Basic ([a-zA-Z0-9=]+)$', req_http_auth) if m == None: return err403(resp) userpass = base64.b64decode(m.group(1)) m = re.match('^(\w+):(\S+)$', userpass) if m == None: return err403(resp) username = m.group(1) password = m.group(2) result = 0 if req_method == 'GET': result = can_user_read(project_info[0], username, password) else: result = can_user_write(project_info[0], username, password) if result == -1: return err401(resp) elif result == 1: return ok200(resp) else: return err403(resp) 


UWSGI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╣реИ:
 uwsgi -s /tmp/uwsgi.sock \
     --wsgi-file /var/projects/vcs_auth/vcs_auth_app.py \
     - www-data-gid www-data \
     --рдкрд┐рдбрд╛рдЗрд▓ / рдЕрдирд╡рд░ / рд╢реНрд░реБрддрд┐_рд╕реБрде_рдкреНрдк.рдкрд┐рдб \
     -d /var/log/uwsgi/vcs_auth_app.log


рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛:
рдбреАрдмреА рд╕реНрдХреАрдорд╛

Source: https://habr.com/ru/post/In136449/


All Articles