最近做项目,遇到单点登录,方法是在前端做nginx代理。
应用系统需要配合做如下调整:
1、使用“*.顶级域名”访问,确保可以和KAM共享cookie
2、对来自Nginx代理的访问放开登录认证(安全起见,对来自其他IP的访问应该禁止)
3、应用系统从请求头kam_remote_user中读取登录用户(Nginx会将登录用户写入请求头)
4、如果应用系统需要KAM的全局唯一token,可以从cookie中读取kam_sso_token的值
刚开始调试的时候是在正式环境,每次修改完代码需要重新构建才能看到效果,
实在繁琐,还产生了一堆不必要的commit 历史。调通之后开始思考如何在本地开发环境调试单点登录这一功能。
不辱使命,研究出来了,以下是步骤。
1、配置项目 nginx.conf
location / {
root /usr/share/nginx/html;
auth_request /kam_auth;
error_page 401 = @error401;
auth_request_set $kam_remote_url $upstream_http_kam_remote_url;
proxy_set_header kam_remote_user $upstream_http_kam_remote_user;
}
location /kam_auth {
internal;
proxy_set_header kam_remote_url "$scheme://$http_host$request_uri";
proxy_set_header Host $host;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_pass 单点登录页面网址/auth;
}
location @error401 {
add_header Set-Cookie "NSREDIRECT=$kam_remote_url;Path=/;Domain=顶级域名";
return 302 单点登录页面网址;
}
配置完后发布到正式环境,单点登录功能已可用
继续配置,我们的目标是 dev 环境也能单点登录!
2、虚拟域名
修改hosts文件 C:WindowsSystem32driversetc
加入 127.0.0.1 dev.testgroup.com
之后,把原来的dev运行地址 http://localhost:8080 换成 http://dev.testgroup.com:8080
发现报错 Invalid Host header
解决方法:在webpack.dev.conf.js devServer对象中添加:disableHostCheck: true
devServer: {
...
disableHostCheck: true
},
重新 run dev 后发现可以访问了
3、下载 nginx
nginx官网上下载相应的安装包
下载进行解压,将解压后的文件放到自己心仪的目录下。window的cmd窗口,进入到nginx目录,
使用 start nginx.exe
进行nginx的安装,如下图所示
安装成功,后在浏览器地址栏输入:127.0.0.1,会看到如下图所示的nginx欢迎界面
如果看不到,那么说明你安装失败,你可以到你的 nginx 目录下的logs文件夹下的error下查看,
如果发现里面写着:
说明你的80端口被占用了,或是cmd命令进入dos下执行:netstat -aon | findstr :80 查看80端口是否被占用,如果占用,那么你需要修改注册表,如下步骤:
1、打开注册表:regedit
2、找到:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesHTTP
3、找到一个REG_DWORD类型的项Start,将其改为0
4、重启系统,System进程不会占用80端口
此时此刻,你可以再次执行 相应的命令:start nginx.exe 命令了。
nginx相关命令:start nginx.exe
nginx.exe -s stop
//停止nginxnginx.exe -s reload
//重新加载nginxnginx.exe -s quit
//退出nginx
因为我们已经配置了虚拟域名,所以在浏览器地址栏输入 http://dev.testgroup.com 也是同样的 nginx welcome 页面
3、配置本地 nginx 文件
修改 nginx 目录下的 conf/nginx.conf 文件
location / {
root html;
index index.html index.htm;
auth_request /kam_auth;
error_page 401 = @error401;
auth_request_set $kam_remote_url $upstream_http_kam_remote_url;
proxy_set_header kam_remote_user $upstream_http_kam_remote_user;
proxy_pass http://dev.testgroup.com:8080;
}
location /kam_auth {
internal;
proxy_set_header kam_remote_url "$scheme://$http_host$request_uri";
proxy_set_header Host $host;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_pass 单点登录页面网址/auth;
}
location @error401 {
add_header Set-Cookie "NSREDIRECT=$kam_remote_url;Path=/;Domain=顶级域名";
return 302 单点登录页面网址;
}
现在,在浏览器地址栏输入 http://dev.testgroup.com 发现自动跳转到了单点登录页面,
登录后返回到了我们之前的dev.testgroup.com页面
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。