一个应用走遍了HTTPD+TOMCAT+CAS,然后被坑

一个应用走遍了HTTPD+TOMCAT+CAS,然后被坑

背景

我参加了公司的一个项目,这个项目聘请了波兰来的大牛当项目经理。项目是scrum式的,因此我代表运维团队和devops团队(本团队目前只有我自己而已)也跟着整个项目组进驻会议室(一般成立项目组都会霸占一个会议室)。

波兰大牛给的架构是这样的:

  • angularJS 前端大部分逻辑全在里面, 页面放在apache httpd上
  • tomcat 与HR等系统对接,获取我们需要的userId,上下级关系等等。
  • httpd 和 tomcat 对接 CAS 做认证

当然还有其它七七八八的东西,就不介绍了。

这个大牛的系统的登陆是这样的:

  • 用户打开浏览器先登陆到apache上
  • mod_cas 联络 cas 登陆并获得session
  • 静态页面呈现,发一个get请求给tomcat中的服务,获得用户ID(提供刚才的session)
  • Tomcat中的cas客户端拿着session去cas服务器验证然后返回
  • 获得用户id继续下面的逻辑

问题

Q1: 浏览器跨域问题,实际上浏览器打开了两个域一个是httpd,一个是tomcat
Q2: 两个CAS客户端如何共享session的问题

解决:

A1: 设置tomcat filter解决跨域
编辑 CATALINA_HOME/conf/web.xml
搜索注释掉的filter, 找个空行插入下面的配置:

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

重启tomcat

A2-1:分为两个部分,首先 httpd的cas配置:

安装mod_cas
rpm -qa | grep cas
mod_auth_cas-1.1-3.el7.x86_64

编辑配置

/etc/httpd/conf.d/auth_cas.conf

CASCookiePath /var/cache/httpd/mod_auth_cas/ # 注意这里apache用户要有读写权限,否则报错
CASLoginURL http://casserver:8080/cas/login
CASValidateURL http://casserver:8080/cas/serviceValidate


<Location /site_html>
Authtype CAS
require valid-user
</Location>


# 然后重启httpd

systemctl restart httpd

A2-2:接着是就是了。。。

angularJS的哥们儿总是调不同。 httpd和tomcat总是各自获得jsession,似乎cas并没有启动作用。
最后有个哥们儿在 stackoverflow 找到答案。

坑在这里

代码例子:

 var getUser = function (){
var def = $q.defer();
$http({
url: 'http://xxxxhost:8080/pjt/servlet/Login', #这里是tomcat返回userId的url
method : 'get',
### 下方高能出现:
withCredentials: true
### 重点就是这句,不加这句的话httpd那里获得的cas
### session就不会传递给tomcat,然后tomcat傻傻的又去cas获得了一遍session于是就出现了问题。
})
.then(function ( data ){
console.log( data );
def.resolve( data );
}, function ( error ){
def.reject( error );
});
return def.promise;
}

我也不太懂angularJS,反正我们就这么愉快的解决了问题。就这样吧。

PS: Tomcat 8 ,httpd 2.4.6-45 , jasig cas 3.3.3 (Apereo)
PS: 我也给大牛提过建议,为什么我们不直接将静态页面全都搞成jsp赛到tomcat里? 这样跨域问题就解决了。大牛并不喜欢这个方案,因为他很讨厌java。。。 好吧。。 其实tomcat这层java 也是强烈要求才加上的,因为我们实在是搞不定httpd,jbpm等所有组件都配置cas client 。