1

最近做项目,遇到单点登录,方法是在前端做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

clipboard.png

之后,把原来的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的安装,如下图所示

clipboard.png

安装成功,后在浏览器地址栏输入:127.0.0.1,会看到如下图所示的nginx欢迎界面

clipboard.png

如果看不到,那么说明你安装失败,你可以到你的 nginx 目录下的logs文件夹下的error下查看,
如果发现里面写着:

clipboard.png

说明你的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 //停止nginx
nginx.exe -s reload //重新加载nginx
nginx.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页面


豆豆
111 声望5 粉丝