首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

cas运用配置

2012-10-25 
cas使用配置单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SS

cas使用配置

单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架,它是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

CAS 具有以下特点:

? ?? ?? ?? ?●开源的企业级单点登录解决方案。

? ?? ?? ?? ?●CAS Server 为需要独立部署的 Web 应用。

? ?? ?? ?? ?

从结构体系看, CAS 包含两部分:

? ???CAS Server

CAS Server 负责完成对用户的认证工作, CAS Server 需要独立部署,有不止一种 CAS Server 的实现, Yale CAS Server 和 ESUP CAS Server 都是很不错的选择。

CAS Server 会处理用户名 / 密码等凭证 (Credentials) ,它可能会到数据库检索一条用户帐号信息,也可能在 XML 文件中检索用户密码,对这种方式, CAS 均提供一种灵活但同一的接口 / 实现分离的方式, CAS 究竟是用何种认证方式,跟 CAS 协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展。

? ?? ? CAS Client

CAS Client 负责部署在客户端(注意,我是指 Web 应用),原则上, CAS Client 的部署意味着,当有对本地 Web 应用的受保护资源的访问请求,并且需要对请求方进行身份认证, Web 应用不再接受任何的用户名密码等类似的 Credentials ,而是重定向到 CAS Server 进行认证。

目前, CAS Client 支持(某些在完善中)非常多的客户端,包括 Java 、 .Net 、 ISAPI 、 Php 、 Perl 、 uPortal 、 Acegi 、 Ruby 、 VBScript 等客户端,几乎可以这样说, CAS 协议能够适合任何语言编写的客户端应用。

??

CAS 是通过 TGT(Ticket Granting Ticket) 来获取 ST(Service Ticket) ,通过 ST 来访问服务,而 CAS 也有对应 TGT , ST 的实体,而且他们在保护 TGT 的方法上虽然有所区别,但是,最终都可以实现这样一个目的——免去多次登录的麻烦。

客户端流程

?1.? ? 第一次访问http://localhost:8080/a,

CLIENT:没票据且SESSION中没有消息所以跳转至CAS

CAS:拿不到TGC故要求用户登录


2.? ?认证成功后回跳

CAS:通过TGT生成ST发给客户端,客户端保存TGC,并重定向到http://localhost:8080/a

CLIENT:带有票据所以不跳转只是后台发给CAS验证票据(浏览器中无法看到这一过程)

认证成功后,CAS服务器创建一个很长的、随机生成的字符串,称为“Ticket”。随后,CAS将这个ticket和成功登录的用户,以及服务联系在一起。这个ticket是一次性使用的一种凭证,它只对登录成功的用户及其服务使用一次。使用过以后立刻失效。


3.? ?第一次访问http://localhost:8080/b

CLIENT:没票据且SESSION中没有消息所以跳转至CAS

CAS:从客户端取出TGC,如果TGC有效则给用户ST并后台验证ST,从而SSO

用户进入应用B时,首先仍然会重定向到CAS服务器。不过此时CAS服务器不再要求用户输 入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登录。然后,CAS同样给出新的ticket重定向应用B给cas验证(流程同应用A验证方式),如果验证成功则应用B创建session记录CASReceipt信息到session中,以后凭此session登录应用B。


4.? ?再次访问http://localhost:8080/a
CLIENT:没票据但是SESSION中有消息故不跳转也不用发CAS验证票据,允许用户访问

?

1环境搭建:

需要的文件


?

JDK 的下载地址:? ?http://java.sun.com

TOMCAT的下载地址:[url=http://tomcat.apache.org/]http://tomcat.apache.org/[/url]


?

客户端

下载网址 http://downloads.jasig.org/cas-clients/

软件版本? ?casclient-3.2


?

服务器

下载网址 http://www.jasig.org/cas/download

软件版本? ?cas server-3.4.5

?

1.2服务器部署

解压此文件夹 cas server-3.4.5

找到cas-server-3.4.5\modules\cas-server-webapp-3.4.5.war

把此文件夹复制到tomcat服务器下webapps里面

修改文件cas-server-webapp-3.4.5.war 为 cas.war

1.3使用http协议的设置??默认设置是使用https协议,如果想使用http协议,需要按以下配置使用
在cas-server-webapp中的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml文件中有如下配置
<bean id="ticketGrantingTicketCookieGenerator" //默认为true,使用https,如果只需要http,修改为false即可
??p:cookieMaxAge="-1"
??p:cookieName="CASTGC"
??p:cookiePath="/cas" />
/WEB-INF/deployerConfigContext.xml 文件
<bean />-->
? ???<bean??ref="dataSource" />
? ?? ?? ?<property name="sql" value="select password from tb_user where? ?? ?? ?? ? user_name=? " />
? ?? ?? ?//用户密码编码方式
? ?? ?? ?<property name="passwordEncoder"? ???ref="passwordEncoderBean"/>
? ?? ?? ?</bean>??
? ?</list>
??</property>
该属性中的list只要用一个认证通过即可,建议将红色部分放在第一位,如果确认只用jdbc一种方式,其他认证方式均可删除。另外需要在在文件中添加datasoure和passordEncoder两个bean,如下
<!—数据源-->
??<bean id="dataSource" />
??</bean>
1.5 让cas server提供更多的用户数据共客户端使用有时候,客户端希望获取到用户名以外的其他字段。我们可以这样来配置

配置文件:
/WEB-INF/deployerConfigContext.xml
<property name="credentialsToPrincipalResolvers">
? ?<list>
? ?? ? <!--<bean />-->
? ?
? ? <bean >
<!--为认证过的用户的Principal添加属性 -- >
<property name="attributeRepository" >? ?
? ? <ref local="attributeRepository"/>
? ???</property>
? ? </bean>
? ?? ?<bean
? ???/>
? ?</list>
??</property>
修改该文件中默认的 attributeRepositorybean配置
<!-- 在这里配置获取更多用户的信息 -->
? ?? ?<bean id="attributeRepository" ref="dataSource" />
<constructor-arg index="1" value="select user_Id , password,EMAIL, FINDPASSWORDACTIVE from tb_user where {0} " />
<property name="queryAttributeMapping">? ?
? ?<map>
<entry key="username" value="user_name"/>
<!-- 这里必须这么写,系统会自己匹配,貌似和where语句后面的用户名字段的拼写没有什么关系??要获取的属性在这里配置-->
</map>
</property>
??<property name="resultAttributeMapping">
??<map>
<!—下面是要返回的数据 记得select 里面 都要有此字段-- >
??<entry key="user_name" value="username"/>
??<entry key="User_ID" value="userid"/>
??<entry key="password" value="password"/>
??<entry key="FINDPASSWORDACTIVE" value="FINDPASSWORDACTIVE"/>
??<entry key="EMAIL" value="EMAIL"/>
??<entry key="QUESTION" value="QUESTION"/>
??</map>
??</property>
</bean>
备注:网上有很多的关于这个的配置,但是如果您使用的是提供的版本或是高于这个版本,就应该象上面这样配置,无用质疑。
修改该xml文件中最后一个默认的serviceRegistryDao bean中的属性全部注释掉,或者删除,这个bean中的RegisteredServiceImpl的ignoreAttributes属性将决定是否添加attributes属性内容,默认为false:不添加,只有去掉这个配置,cas server才会将获取的用户的附加属性添加到认证用的Principal的attributes中去.

<bean
??id="serviceRegistryDao"
? ?? ???value="0" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="name" value="HTTP" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="description" value="Only Allows HTTP Urls" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="serviceId" value="http://**" />
? ?? ?? ?? ?? ?? ???</bean>
? ?? ?? ?? ?? ?? ???<bean value="1" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="name" value="HTTPS" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="description" value="Only Allows HTTPS Urls" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="serviceId" value="https://**" />
? ?? ?? ?? ?? ?? ???</bean>
? ?? ?? ?? ?? ?? ???<bean value="2" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="name" value="IMAPS" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="description" value="Only Allows HTTPS Urls" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="serviceId" value="imaps://**" />
? ?? ?? ?? ?? ?? ???</bean>
? ?? ?? ?? ?? ?? ???<bean value="3" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="name" value="IMAP" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="description" value="Only Allows IMAP Urls" />
? ?? ?? ?? ?? ?? ?? ?? ?<property name="serviceId" value="imap://**" />
? ?? ?? ?? ?? ?? ???</bean>
? ?? ?? ?? ?? ? </list>
? ?? ?? ?? ?</property>-->
? ?? ?? ???</bean>
修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,红色字体是增加部分。如果不增加此部分客户端也将获取不到其他的数据
如下:
<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
??<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>
??<c:if test="${not empty pgtIou}">
? ?<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
??</c:if>
??<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
? ?<cas:proxies>
? ? <c:forEach var="proxy" items="${assertion.chainedAuthentications}"
? ???varStatus="loopStatus" begin="0"
? ???end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
? ???<cas: proxy>${fn: escapeXml( proxy.principal.id)}</cas:proxy>
? ? </c:forEach>
? ?</cas:proxies>
??</c:if>
?? <c:if
? ?test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)
>
0}">
? ?<cas:attributes>
? ? <c:forEach
var="attr"
? ???items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
? ???varStatus="loopStatus"
begin="0"
? ???end="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)-1}"
? ???step="1">
? ???<cas: ${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas: ${fn:escapeXml(attr.key)}>
? ? </c:forEach>
? ?</cas:attributes>
??</c:if>
</cas:authenticationSuccess>
</cas:serviceResponse>

1.6 客户端登录

如果客户端第一次没有登录系统的话,将会跳转到CAS服务器验证。

在web.xml里面增加

<!--该过滤器负责用户的认证工作,必须启用它—- >

<filter>? ?

? ?<filter-name>CAS Authentication Filter</filter-name>? ?

? ?<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>? ?

? ?<!-- CAS login 服务地址-->? ?

? ?<init-param>? ?

? ?? ? <param-name>casServerLoginUrl</param-name>? ?

? ?? ? <param-value>http://192.168.16.197:8080/cas/login</param-value>? ?

? ?</init-param>? ?

? ? <init-param>? ?

? ?? ???<param-name>renew</param-name>? ?

? ?? ???<param-value>true</param-value>? ?

? ? </init-param>? ?

? ? <init-param>? ?

? ?? ???<param-name>gateway</param-name>? ?

? ?? ???<param-value>false</param-value>? ?

? ? </init-param>? ?

? ? <!-- 客户端应用服务地址-->? ?

? ? <init-param>? ?

? ?? ???<param-name>serverName</param-name>? ?

? ?? ???<param-value>http://localhost:8080/x431</param-value>? ?

? ? </init-param>? ?

</filter>? ?


?

<!--负责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://192.168.16.197:8080/cas</param-value>? ?

? ? </init-param>? ?

? ? <init-param>? ?

? ?? ???<param-name>serverName</param-name>? ?

? ?? ???<param-value>http://localhost:8080</param-value>? ?

? ? </init-param>? ?

? ? <init-param>? ?

? ?? ???<param-name>useSession</param-name>? ?

? ?? ???<param-value>true</param-value>? ?

? ? </init-param>? ?

? ? <init-param>? ?

? ?? ???<param-name>redirectAfterValidation</param-name>? ?

? ?? ???<param-value>true</param-value>? ?

? ? </init-param>? ?

</filter>

<!--

? ?? ? 该过滤器负责实现HttpServletRequest请求的包裹,

? ?? ? 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。

-->??

<filter>? ?

? ? <filter-name>CAS HttpServletRequest WrapperFilter</filter-name>? ?

? ? <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>? ?

</filter>? ?

<!--

? ?? ? 该过滤器使得开发者可以通过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 Authentication Filter</filter-name>? ?

? ? <url-pattern>/*</url-pattern>? ?

</filter-mapping>? ?

<filter-mapping>? ?

? ? <filter-name>CAS Validation Filter</filter-name>? ?

? ? <url-pattern>/*</url-pattern>? ?

</filter-mapping>? ?

<filter-mapping>? ?

? ? <filter-name>CAS HttpServletRequest WrapperFilter</filter-name>? ?

? ? <url-pattern>/*</url-pattern>? ?

</filter-mapping>? ?

<filter-mapping>? ?

? ? <filter-name>CAS Assertion Thread Local Filter</filter-name>? ?

? ? <url-pattern>/*</url-pattern>? ?

</filter-mapping>


1.7 客户端登出

在web.xml里面增加


?

<!-- 改过滤器用于实现单点登出功能,可选配置--??>

<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>? ?


?

<listener>? ?

<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>? ?

</listener>


?

页面增加

<a href="http://192.168.16.197:8080/cas/logout?service=http://192.168.16.232:8080/x431">退出</a><br/>


?

如果想让客户端退出后返回到登录界面,在服务器 WEB-INF\cas-servlet.xml

增加红色部分

WEB-INF\cas-servlet.xml

<bean id="logoutController"

? ?? ?? ?? ?p:followServiceRedirects="true"/>

1.8 客户端获取数据

<%@page import="org.jasig.cas.client.authentication.AttributePrincipal" %>


?

<%@page??import="java.util.*" %>


?

<%


?

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();


?

String loginName = principal.getName();

out.println("loginName? ?"+loginName);

Map<String, Object> attributes = principal.getAttributes();

??out.println("<br>");


?

??if(attributes != null) {

??out.println(attributes.get("userid"));

??out.println("<br>");

??out.println("password"+attributes.get("password"));

??out.println("<br>");

??out.println("EMAIL"+attributes.get("EMAIL"));

??out.println("<br>");

? ?? ?? ?? ?? ?out.println("FINDPASSWORDACTIVE"+attributes.get("FINDPASSWORDACTIVE"));


?

? ? out.println("<br>");

? ???}

%>

?

?

?

源码:

数据库:

?

?

casServiceValidationSuccess.jsp

?

ticketGrantingTicketCookieGenerator.xml

?web.xml 加入编码设置:

?

?

index.jsp

?

热点排行