
1 前言
一个问题,一篇文章,一出故事。
笔者的nextcloud需要透过反向代理实现企业外部2FA认证,内部使用普通的用户名和密码认证,于是整理此文。
实现思路是由nextcloud的“SSO & SAML authentication”插件产生两个登录入口,详细如下图,
根据以上两个入口的不同链接,通过Nginx反向代理的代码判断用户是私有地址或公有地址然后强制分流。
2 最佳实践
2.1 增加根据私网判断的重写代码
vim /etc/nginx/nextcloud.cmdschool.org
加入如下代码,
geo $lan_subnet { default 0; 10.0.0.0/8 1; 172.16.0.0/12 1; 192.168.0.0/16 1; } server { #... if ($lan_subnet = 0){ rewrite ^/index.php/login(.*)$ /index.php/apps/user_saml/saml/login?idp=1 break; } if ($lan_subnet = 1){ rewrite ^/index.php/login(.*)$ /index.php/login?redirect_url=&direct=1 break; } #... }
需要注意的是,
– 命令“geo”根据浏览器客户端的源地址赋值,默认为“0”,如果用户是私有地址赋值为“1”
– 第一个“if”判断变量“lan_subnet”是否等“0”,如果等于“0”则执行大括号中的重写指令
– 第一个“rewrite”指令模式匹配URL“^/index.php/login(.*)$”,成功则重写到SSO认证接口
– 第二个“if”判断变量“lan_subnet”是否等“1”,如果等于“1”则执行大括号中的重写指令
– 第二个“rewrite”指令模式匹配URL“^/index.php/login(.*)$”,成功则重写到普通登录页面
2.2 重载使服务生效
systemctl reload nginx
参阅文档
======================
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
http://nginx.org/en/docs/http/ngx_http_geo_module.html
没有评论