美文网首页
beego结合nginx实现LDAP认证登录

beego结合nginx实现LDAP认证登录

作者: xyz098 | 来源:发表于2020-03-06 21:48 被阅读0次
    • 基础认证 auth_basic
    • 第三方认证 auth_request

    auth_basic

    1. 创建用户密码保存到文件
    2. 配置auth_basic指令
    # htpasswd工具
    yum -y install httpd-tools 
    # 创建test用户和保持密码的pass.db文件
    cd /usr/local/nginx/conf
    htpasswd -c pass.db test
    # 配置基础认证
    vim /usr/local/nginx/conf.d/local.conf
    server {
        listen       80;
        server_name  local.abc.com;
        
        auth_basic "User Authentication";
        auth_basic_user_file /usr/local/nginx/conf/pass.db;
        
        location / {
            root   /data/www;
            index  index.html;
        }
    }
    

    ngx_http_auth_request_module

    基本思路

    • 存储:cookie存储base64后的用户密码、原始url
    • 生产者: 登录页面存储cookie,编码用户密码,返回200跳转到原始url
    • 消费者: 认证页面读取cookie,解码用户密码LDAP认证,成功返回200,否则返回401

    登录模块 backend-sample-app.py

    • 表单认证:获取nginx传递X-Target,获取到则表单渲染,否则直接500返回内部错误

    • 表单渲染:传递X-Target到表单,渲染出包含用户密码和隐藏X-Target的表单登录页

    • 表单提交: 获取表单页提交的用户、密码、隐藏X-Target;判断不为空,则base64编码用户密码到cookie,返回200跳转到X-Target;判断为空,跳到表单渲染

    认证逻辑 nginx-ldap-auth-daemon.py

    • cookie不存在: 直接返回401是设置Cache-Control:no-cache
    • cookie存在:用base64解码用户密码,ldap认证,成功返回200,失败返回401时设置Cache-Control:no-cache

    nginx逻辑 nginx-ldap-auth.conf

    • auth_request模块:首先内部认证

    • error_page指令: 内部跳转到登录页

    • 缓存模块:认证通过后进行缓存,否则一直需要进行LDAP认证会很慢。

      proxy-cache实现回源服务器缓存

      # 编译 auth_request 和 ngx_cache_purge模块
      wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
      ./configure --prefix=/usr/local/openresty --with-http_auth_request_module  --add-module=modules/ngx_cache_purge-2.3
      make && make install
      
      # 配置
      http {
          # 缓存设置
          # 缓存路径 cache/
          # keys_zone 设置缓存名字和共享内存大小
          # levels 设置缓存文件目录层次;levels=1:2 表示两级目录
          # inactive  在指定时间内没人访问则被删除
          # max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源
        proxy_cache_path cache/  keys_zone=auth_cache:10m levels=1:2 inactive=7d max_size=1000g;
        
        server {
            listen       81;
            server_name  192.168.56.101;
            
            location / {
                     # 先调整到内部认证/auth,不改变url
                   auth_request /auth;
                   # 内部认证返回401,则再次内部跳转到登录页
                     error_page 401 =200 /login;
                     proxy_pass  http://10.51.1.31:5601/;
              }
              
              location /auth {
                    # 设置为内部调用,不会改变原始请求url
                    internal;
                    proxy_pass http://127.0.0.1:8081/auth;
                        
                    proxy_pass_request_body off;
                      proxy_set_header Content-Length "";
                      
                    ### 十分钟内不用重新向后端认证
                    ### no-cache : 当设置no-cache时,nginx不会缓存
                    proxy_cache auth_cache;
                    # 对httpcode为200…的缓存10分钟
                    proxy_cache_valid 200 10m;
                    # 缓存唯一key来进行hash存取,这里的cookie中nginxauth保存base64后的用户密码字段
                  proxy_cache_key "$http_authorization$cookie_nginxauth";
              }
              
              location /login {
                 # 因为都是内部认证,所以url为原始rul
                   proxy_set_header X-Target $request_uri;
                 proxy_pass http://127.0.0.1:8081/login;
             }
             
             # 清理缓存 curl http://192.168.56.101:81/cleancache/auth_cache
             location /cleancache/ {
                   # allow 127.0.0.1;
                   # deny all;
                   proxy_cache_purge auth_cache "$http_authorization$cookie_nginxauth";
             }
          }
      }
      

    beego开发 ldap_auth_nginx

    bee工具

    bee new ldap_auth_nginx  # 创建
    bee run                  # 热加载模式
    bee pack                 # 打包
    

    app.conf

    ; LDAP
    addr = "xxx:389"
    binddn = "xxx"
    bindpass = "xxx"
    basedn = "ou=xxx,dc=aaa,dc=com"
    tls = false
    starttls = false
    
    ; 自定义用户白名单
    whitelist = "aa;bb"
    

    github.com/astaxie/beego/config.go

    // 增加配置
    type Config struct {
        ... 
        LDAPConfig          LDAPConfig
        WhiteList           string
        WhiteMap            map[string]bool
    }
    
    // 初始化配置
    func assignConfig(ac config.Configer) error {
        for _, i := range []interface{}{BConfig, &BConfig.Listen, &BConfig.WebConfig, &BConfig.Log, &BConfig.LDAPConfig, &BConfig.WebConfig.Session} {
            assignSingleConfig(i, ac)
        }
        ...
        // set whitelist
        BConfig.WhiteMap = make(map[string]bool)
        if BConfig.WhiteList != "" {
            list := strings.Split(BConfig.WhiteList, ";")
            for _, name := range list {
                BConfig.WhiteMap[name] = true
            }
        }
        ...
    }
    

    相关文章

      网友评论

          本文标题:beego结合nginx实现LDAP认证登录

          本文链接:https://www.haomeiwen.com/subject/bliorhtx.html