美文网首页
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