码迷,mamicode.com
首页 > 其他好文 > 详细

SSO(Single Sign On)系列(三)--CAS单点登录

时间:2015-07-14 18:12:34      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

          上篇文章介绍了SSO的原理以及5种基本流程,相信看完了之后不难理解单点登录,而CASSSO的一种实现方案,原理是一样的。下面介绍一下。

 

CAS Server:负责完成对用户的认证工作,需要独立部署,CAS Server会处理用户名/密码等凭证。

CAS Client:负责处理对客户端受保护资源的访问请求,需要对请求方进行身份认证时,重定向到CAS Server进行认证。CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护资源。

 

CAS请求认证图

技术分享

          说明:CAS Client与受保护的客户端应用部署在一起,以Filter方式保护Web应用的受保护资源,过滤从客户端过来的每一个web请求,同时,CAS Client会分析HTTP请求中是否包含请求Service Ticket,如果没有,则说明该用户是没有经过认证的;于是CAS Client会重新定向到CASServer(传递Service<要访问的资源地址>+cookie)。CAS Server验证TGT失败返回登录页面。输入认证信息,如果Credentials认证信息成功,CAS Server随机产生一个相当长度、唯一、不可伪造的Service Ticket,并缓存以待将来验证,并重定向到Service所在地址,并为客户端浏览器设置一个Ticket Granted Cookie;Cas Client 在拿到Service和新产生的Ticket过后,在CAS Server进行验证,验证成功后,进行缓存。


经过分析发现,CAS请求认证图和上篇文章的SSO认证图是大同小异的。

 

实例


       两个CAS Client实现单点登录效果,登录进去之后显示更多的验证信息:(以tomcat中的示例example为例做测试)

       服务器:tomcat 6.0


一、CAS Server部署

       解压cas-server-3.5.2-release.zip(提取cas-server-3.5.2-release.zip\cas-server-3.5.2\modules\cas-server-webapp-3.5.2.war,重命名为cas.war)部署到tomcat中。

 

二、CAS Client配置:

 1、\WEB-INF\lib下添加jar

        

    cas-client-core-3.2.0(cas-client-3.2.0-release.zip解压提取cas-client-3.2.0/modules/cas-client-core-3.2.0

       commons-logging-1.1.1

  

    

2web.xml配置拦截器(client1为例)

          

 <listener>
                       <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
                </listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
                <filter>
                        <filter-name>CASSingle Sign Out Filter</filter-name>
                       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
                </filter>
                <filter-mapping>
                        <filter-name>CASSingle 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:8080/cas/login</param-value>
                        </init-param>
                        <init-param>
                               <param-name>serverName</param-name>
                               <param-value>http://localhost:18080</param-value>
                        </init-param>
                </filter>
                <filter-mapping>
                        <filter-name>CASFilter</filter-name>
                       <url-pattern>/*</url-pattern>
                </filter-mapping>
                <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
                <filter>
                        <filter-name>CASValidation Filter</filter-name>
                        <filter-class>
                               org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
                        <init-param>
                               <param-name>casServerUrlPrefix</param-name>
                               <param-value>http://localhost:8080/cas</param-value>
                        </init-param>
                        <init-param>
                               <param-name>serverName</param-name>
                               <param-value>http://localhost:18080</param-value>
                        </init-param>
                </filter>
                <filter-mapping>
                        <filter-name>CASValidation Filter</filter-name>
                       <url-pattern>/*</url-pattern>
                </filter-mapping>
<!--
                        该过滤器负责实现HttpServletRequest请求的包裹,
                        比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
                -->
                <filter>
                        <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
                        <filter-class>
                               org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
                </filter>
                <filter-mapping>
                        <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
                       <url-pattern>/*</url-pattern>
                </filter-mapping>
<!--
                该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
                比如AssertionHolder.getAssertion().getPrincipal().getName()。
                -->
                <filter>
                        <filter-name>CASAssertion Thread Local Filter</filter-name>
                       <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
                </filter>
                <filter-mapping>
                        <filter-name>CASAssertion Thread Local Filter</filter-name>
                       <url-pattern>/*</url-pattern>
                </filter-mapping>


3、同理在client2web.xml配置同上,注意修改端口号

 

4、页面显示更多的凭证信息

代码:HelloWorldExample.java里面添加代码:

 

Assertion assertion = (Assertion)request.getSession().getAttribute(
               AbstractCasFilter.CONST_CAS_ASSERTION);
if (null != assertion){
        out.println(" Log | ValidFromDate=:"
                        +assertion.getValidFromDate() + "<br>");
        out.println(" Log | ValidUntilDate=:"
                        +assertion.getValidUntilDate() + "<br>");
        Map<String, Object> attMap =assertion.getAttributes();
        out.println(" Log | getAttributesMap size = " + attMap.size()
                        +"<br>");
        for (Entry<String, Object> entry: attMap.entrySet()) {
                out.println("     | " + entry.getKey() + "=:"
                                +entry.getValue() + "<br>");
        }
        AttributePrincipal principal =assertion.getPrincipal();
//AttributePrincipalprincipal = (AttributePrincipal) request
        // .getUserPrincipal();
String username = null;
        out.print(" Log |UserName:");
        if (null != principal) {
                username = principal.getName();
                out.println("<spanstyle='color:red;'>" + username
                                +"</span><br>");
        }
}


5、测试验证:

输入client1网址:http://localhost:18080/examples/servlets/servlet/HelloWorldExample

跳转到登录页面:

技术分享

输入用户名,密码:admin,admin

跳转页面

技术分享

看返回地址,在这里返回一个STclient端,缓存起来。

 

接着访问client2,网址:http://localhost:28080/examples/servlets/servlet/HelloWorldExample,不用输入用户名和密码,跳转到client2的业务页面:

技术分享

       看输入链接,只有本地的链接

        原理:根据Cookie验证是否已经登录

 

       注:如果访问有问题,则修改安全认证的安全级别,cas默认的是HTTPS协议,如果对安全的要求不高,可使用HTTP协议。


        修改默认协议如下:

        修改deployerConfigContext.xml 增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。

       

<beanclass="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"p:httpClient-ref="httpClient"
p:requireSecure="false"/>
 
       修改ticketGrantingTicketCookieGenerator.xml(cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml) 中ticketGrantingTicketCookieGenerator p:cookieSecure 属性 修改为 false。
       <beanid="ticketGrantingTicketCookieGenerator"class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"p:cookieMaxAge="-1" p:cookieName="CASTGC"p:cookiePath="/cas" />


总结

         通过cas,系统之间解耦,并且不用开发人员再单独去开发信息认证系统,统一的信息管理平台,大大简化了开发。

 

附源码


版权声明:本文为博主原创文章,未经博主允许不得转载。

SSO(Single Sign On)系列(三)--CAS单点登录

标签:

原文地址:http://blog.csdn.net/liutengteng130/article/details/46848281

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!