通过反向代理方式处理cas单点登录内外网双ip访问的问题

前言:由于项目部署的的环境是内外网隔离的模式,把网络分成内网和外网两部分。cas服务器及客户端部署在内网,通过端口映射的方式把服务端口向外网开放,外网用户只能通过外网IP访问客户端。因此会存在一个问题,我们的客户端配置casServer地址及回调的url使用的是内网的。用户通过外网ip访问后,跳转的cas登录地址为内网的地址,因此是访问失败的。而如果配置成外网ip的话,通过内网ip访问也是失败的,浏览器显示的是外网的地址。

我们的需求是,通过外网ip访问的客户端业务系统,重定向到外网的cas服务器,登录后跳转回来外网ip的业务系统,内网同样的需求。查阅资料发现,通过改源码去动态根据访问ip修改cas服务器的地址及客户端回调地址的方法,一是费时且找不到可用资料,二是业务系统太多,改了一套其它都得改,造成大面积的客户端业务系统更新,三是部分业务系统不是自己公司开发的,需要协调第三方去修改。因此采用通过反向代理方式处理cas单点登录内外网双ip访问的问题。实践证明,只需要短短半小时便解决问题。

一、通过apache进行反向代理

1.下载apache的安装包及apr的安装包

官网下载Apache的源码包,http://httpd.apache.org/
这里下载的版本是:httpd-2.4.41.tar.gz
到http://apr.apache.org/下载APR源码包和APR-util源码包
这里下载的版本分别是:apr-1.6.5.tar.gz、apr-util-1.6.1.tar.gz
把httpd-2.4.41.tar.gz、apr-1.6.5.tar.gz、apr-util-1.6.1.tar.gz上传到/opt/tools目录下

2.解压apr及apr-util源码包

# cd /opt/tools
# tar -zxvf httpd-2.4.41.tar.gz
# tar -zxvf apr-1.6.5.tar.gz
# tar -zxvf apr-util-1.6.1.tar.gz

3.安装相关组件

# yum -y install gcc gcc-c++ make
# yum -y install expat-devel
# yum -y install pcre-devel
# yum -y install mod_ssl openssl-devel
# yum -y install libtool-ltdl-devel

4.安装apr

# cd /opt/tools/apr-1.6.5
# ./configure --prefix=/usr/local/apr
# make
# make install

5.安装apr-util

# cd /opt/tools/apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make
# make install

6.安装httpd

# cd /opt/tools/httpd-2.4.41
# ./configure --prefix=/opt/app/apache24 --enable-so --enable-ssl --enable-rewrite --enable-cgi --enable-cgid --enable-modules=most --enable-mods-shared=most --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
# make
# make install

7.启动命令

为了方便以后使用apache可以将执行路径添加的PATH中,这样下次执行命令时,就不需要使用路径
# echo PATH=$PATH:/opt/app/apache24/bin/apachectl >> /etc/profile
# source /etc/profile

启动:
# apachectl start
停止:
# apachectl stop
重启:
# apachectl restart

8.修改httpd.conf配置文件

# vi /opt/app/apache24/conf/httpd.conf
把#ServerName www.example.com:80前面的#号去掉,并把www.example.com修改为内网ip加端口,保存退出
重启apache
# apachectl restart

9.配置反向代理

# vi /opt/app/apache24/conf/httpd.conf
在httpd.conf中把下三行配置放开(前面的#号去掉)
LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_http_module modules/mod_proxy_http.so
Include conf/extra/httpd-vhosts.conf

10.在conf/extra/httpd-vhosts.conf中配置虚拟主机(反向代理)

# vi /opt/app/apache24/conf/extra/httpd-vhosts.conf
在文件末尾添加以下配置:
# 外网地址
<VirtualHost *:8080>
    ServerName  192.168.4.120
    ServerAlias 192.168.4.120
    ErrorLog "logs/error_log"
    CustomLog "logs/access_log" common
    
    # 关闭正向代理
    ProxyRequests Off
    # 反向代理时不保留原始Request中的HOST(即代理服务器自身Host)
    ProxyPreserveHost Off
    
    ## 把服务器响应中的内网IP地址改成外网地址
    Substitute "s|127.0.0.1:8083/dognet|192.168.4.120/dognet|n"
    Substitute "s|127.0.0.1:8443/cas|192.168.4.120/cas|n"
    Substitute "s|127.0.0.1:8081/ywjk|192.168.4.120/ywjk|n"
    
    # SSO反向代理
    ProxyPass /cas http://127.0.0.1:8443/cas
    ProxyPassReverse /cas http://127.0.0.1:8443/cas
    
    # Web应用反向代理
    ProxyPass /dognet http://127.0.0.1:8083/dognet
    ProxyPassReverse /dognet http://127.0.0.1:8083/dognet
    
    # Web应用反向代理
    ProxyPass /ywjk http://127.0.0.1:8081/ywjk
    ProxyPassReverse /ywjk http://127.0.0.1:8081/ywjk
</VirtualHost>

11.重启apache

# apachectl restart

12.springboot客户端配置的是内网的cas服务器地址及客户端地址

#cas配置
cas:
  client-name: ywjk
  #测试工作机地址
  server:
    url: http://127.0.0.1:8443/cas
  #本机ip地址
  project:
    url: http://127.0.0.1:8081/ywjk/

13.测试

通过访问192.168.4.120:8080/ywjk时,重定向到http://192.168.4.120:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8081%2Fywjk%2F%2Fcallback%3Fclient_name%3Dywjk,登录后跳转回192.168.4.120:8080/ywjk。而通过127.0.0.1:8080/ywjk访问时,重定向到http://127.0.0.1:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8081%2Fywjk%2F%2Fcallback%3Fclient_name%3Dywjk,登录后跳转回127.0.0.1:8080/ywjk。至此,内外网双ip问题得以解决。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值