因为企业多用SOA架构,所以目前企业比较流行的企业业务整合方案显得尤为重要.下面对其解决方案之一------单点登录做一个探究.
A.单点登录(Single Sign On),简称SSO.
定义:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.
同上述提到的问题一样,我们目前的系统大多存在于诸多的子系统中,而这些子系统分别部署在不同的服务器中,那么使用传统方式的Session是无法解决的,我们需要使用相关的单点登录技术来解决.
B.CAS介绍:
Yale大学发起的一个开源项目.旨在为Web应用系统提供一种可靠的单点登录方法,在2014年12月正式成为JA-SIG的一个项目.
特点:
1.开源的企业级单点登录解决方案.
2.CAS Server 为需要独立部署的web应用
3.CAS Client支持非常多的客户端(其系统中的各个web应用),包括java,.Net,PHP,Perl,Apache,uPortal,Ruby等.
CAS包含两个部分: CAS Server 和CAS Client. CAS Server需要独立部署,主要负责对用户的认证工作;CAS Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server.
工作流程图:
1.访问服务:Web浏览器发送请求访问应用系统提供的服务资源
2.定向认证:SSO客户端会重定向用户请求到SSO服务器
3.用户认证:用户身份认证
4.发放票据:SSO服务器会产生一个随机的Service Ticket.
5.验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务.
6.传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端.
用户CAS单点登录全流程解释:我们通过浏览器访问CAS客户端(所谓客户端就是我们的应用,采用了CAS配置),首次登录没有票据(Service Ticket),客户端会重定向到CAS服务器,在浏览器显示登录页面,进行登录,登录后在服务器端进行认证,认证成功会带着发放的票据回到当前要登录的应用.再访问其他应用,就会去验证当前存储的票据是否为登录票据,如果是返回用户名一系列信息.
我们登录后CAS发放的票据是存放在cookie中的,这样当我们清除浏览器的缓存之后,就会把票据清除,没有票据后就要重新登录.
C.使用简介:
CAS服务端是一个war包,我们只需要放入tomcat目录下的webapps下.启动tomcat即可,自动解压.浏览器输入localhost:8080/cas/login可以看到CAS自带的登录界面
固定登录用户名和密码 casuser/Mellon
可以将tomcat修改为指定的端口xxxx
在tomcat目录 conf/server.xml
同时需要修改CAS的配置文件 找到cas文件下WEB-INF/cas.properties
server.name=http://localhost:xxxx
a.关于协议使用:
CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需要向特定的机构申请和购买).如果对安全要求不高或是在开发测试阶段,可以使用HTTP协议(不过目前谷歌已经逐渐去除HTTP化了,所以HTTP协议看来逐渐会变得只能在测试阶段使用使用了).我们可以通过配置,让CAS使用HTTP协议.
1.修改cas 目录 下的WEB-INF/deployerConfigContext.xml
找到如下配置
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"/>
增加参数 p:requireSecure="false", requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用.
2.
修改
cas
的
/WEB-INF/spring
-configuration/ticketGrantingTicketCookieGenerator.xml
如下配置:
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
参数p:cookieSecure="true",同为HTTPS验证相关,true为采用HTTPS验证,false为不采用.
参数p:cookieMaxAge="-1",是cookie的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其他窗口,仍然要求验证(这样就失去了使用CAS的本意).可以根据需求修改为大于0的数,比如3600等,意思是在3600秒内,打开任意窗口,都不要验证
将
p:cookieSecure改为false, cookieMaxAge改为3600(按需求)
3. 修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
如下配置:
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
修改如第2步
b.配置客户端
1.给自己的项目配置配置文件
在pom.xml中引入cas客户端相关jar包
cas-client-core
2.配置web.xml设置相关配置
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:xxxx/cas/login</param-value>
<!--这里的server是服务端的IP -->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:yyyy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:xxxx/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:yyyy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
c.退出登录
可以在网站标签加入如上链接
在退出登录之后进行跳转到指定页面的配置
修改cas系统的配置文件cas-servlet.xml
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:
true
}"/>
将最后的p名称改为true,可以在退出时跳转到目标页面
修改退出链接为:
d.修改配置数据源:让用户名密码从我们自己的数据表验证
1.
修改
cas
服务端中
web-inf
下
deployerConfigContext.xml
2.在配置文件中去除使用固定用户名和密码的设置
3.将数据库需要的jar包放入webapps/cas/WEB-INF/lib下
e.可以设置登录界面改造
1.将自己的登录页拷贝到cas下的WEB-INF/view/jsp/default/ui 目录下.
2.将所页面需要的数据文件放到cas目录下
3.将自己的登录页面改名为casLoginView.jsp
d和 e 步骤之后另写...