图片 4

单点登录之服务端配置,结合cookie源码分析

Posted by

先说具体的改造方案:

1.开源单点登录系统CAS入门

预备知识

具体的CAS协议见, CAS
Protocal,接下来我们讲jasig的CAS
Implementation的几个重要的点,以下所有描述都基于版本
3.5.2.1

JASIG有以下几个比较重要的接口

  • Credentials
    用户认证凭证,
    CAS的默认凭证只有用户名密码,所以如果想在认证的时候除了用户名密码外还要验证产品信息,就要自定义一个Credentials了,下面的Handler和Resolver都有一个support接口,用来判断是否支持处理某种类型的Credentials

  • AuthenticationHandler
    前台页面提交登录信息后,此接口判断登录信息是否能认证通过,接口会抛出一个AuthenticationException异常,用以在上层代码中catch并在前台页面显示错误信息

  • CredentialsToPrincipalResolver
    CAS-Client端与CAS-Server交互时返回结果,默认只有一个username,如果想附带其他属性,可以自己实现一个Resolver,此外,jasig提供了一些与LDAP等系统集成的Resolver,功能也十分强大

  • AuthenticationException
    在authentication阶段可能会抛出异常,抛出的异常信息可以前台页面中进行展示

服务端:

一、CAS Server端的修改

1、找到cas\WEB-INF\deployerConfigContext.xml

对以下Bean增加参数p:requireSecure=”false”,该参数表示是否需要安全验证,即HTTPS,false为不采用,加上去之后如下:

 

<!-- Required for proxy ticket mechanism. -->
    <bean id="proxyAuthenticationHandler"
          class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
          p:httpClient-ref="httpClient"
          p:requireSecure="false" />

2、找到cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />

参数p:cookieSecure=”true”,同理为HTTPS验证相关,true为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。

参数p:cookieMaxAge=”-1″,简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。

3、找到cas\WEB-INF\spring-configuration\warnCookieGenerator.xml

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />

两个参数与上面同理。应保持一致。

 

1.1什么是单点登录

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

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

图片 1

CAS部署与配置##

对于版本 3.5.x, 部署的war包为 module文件夹下的
cas-server-webapp-3.5.2.1.war

改造的原因:

为什么要吧cookieSecure的属性设置成false呢?让我们去Cookie.class的源码里面去看一下:

    /**
     * Indicates to the browser whether the cookie should only be sent
     * using a secure protocol, such as HTTPS or SSL.
     *
     * <p>The default value is <code>false</code>.
     *
     * @param flag    if <code>true</code>, sends the cookie from the browser
     *            to the server only when using a secure protocol;
     *            if <code>false</code>, sent on any protocol
     *
     * @see #getSecure
     *
     */

    public void setSecure(boolean flag) {
    secure = flag;
    }

看一下方法前面的注释就明白了。如果设置成true,那么只有使用了安全协议才会从浏览器把cookie发送给server。默认是设置成false的。而cas默认是支持https协议的,cas中给默认设置成了true。如果想改造成http的,就得把cookie的这个属性设置成false。

而cas中涉及到cookie相关的就是这两个bean了。

1.2什么是CAS

CAS是Yale大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。CAS具有以下特点:

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

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

CAS
Client支持非常多的客户端(这里指单点登录系统中的各个Web应用),包括Java,
.Net, PHP, Perl, Apache, uPortal, Ruby等。

从结构上看,CAS包含两个部分:CAS Server和CAS Client。CAS
Server需要独立部署,主要负责对用户的认证工作;CAS
Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS
Server。下图是CAS最基本的协议过程:

图片 2

SSO单点登录访问流程主要有以下步骤:

1.访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2.定向认证:SSO客户端会重定向用户请求到SSO服务器。

3.用户认证:用户身份认证。

4.发放票据:SSO服务器会产生一个随机的Service Ticket。

5.验证票据:SSO服务器验证票据Service
Ticket的合法性,验证通过后,允许客户端访问服务。

6.传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

ST:(service tickect)用于验证CAS的客户端是否是真正的客户端。

TGT:用户证明自己在CAS服务端登录过,存在cookie保存起来的。

无https配置

  • 修改 /WEB-INF/deployerConfigContext.xml, 设置安全属性

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
  p:httpClient-ref="httpClient"  p:requireSecure="false"/>
  • 修改
    /WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

<bean id="ticketGrantingTicketCookieGenerator"
    class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    p:cookieSecure="false"
    p:cookieMaxAge="-1"  
    p:cookieName="CASTGC"
    p:cookiePath="/cas" />
 </beans>
  • 修改 \WEB-INF\spring-configuration\warnCookieGenerator.xm

<bean id="warnCookieGenerator"
    class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    p:cookieSecure="true"  
    p:cookieMaxAge="-1"  
    p:cookieName="CASPRIVACY"
    p:cookiePath="/cas" />
  1. 参数p:cookieSecure=”true”,TRUE为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。
  2. 参数p:cookieMaxAge=”-1″,简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。

THE END

客户端:

把对应filter中的https连接修改成http:

<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://**.**.com/logout</param-value>
<!--这里的server是服务端的IP -->
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>*.json</url-pattern>
</filter-mapping>

现在就可以走http协议了

1.3 CAS服务端部署

Cas服务端其实就是一个war包。

博主已经整理好资源 下载直接用
链接:

cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入

注:启动登录成功之后务必把cas.war删除掉

图片 3

这里有个固定的用户名和密码 casuser
/Mellon

登录成功后会跳到登录成功的提示页面

1.4 CAS服务端配置

1.4.1端口修改

如果我们不希望用8080端口访问CAS,可以修改端口

修改TOMCAT的端口

打开tomcat目录conf\server.xml找到下面的配置

图片 4

将端口8080,改为89

修改CAS配置文件

修改CAS配置文件

修改cas的WEB-INF/cas.properties

server.name=http://localhost:89

CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买)。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。1.4.2去除https认证

修改cas的WEB-INF/deployerConfigContext.xml

找到下面的配置

<bean p:httpClient-ref="httpClient"/>

修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml这里需要增加参数p:requireSecure=”false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用

找到下面配置.

<bean        p:cookieSecure="true"      p:cookieMaxAge="-1"      p:cookieName="CASTGC"      p:cookiePath="/cas" />

参数p:cookieMaxAge=”-1″,是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。参数p:cookieSecure=”true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。

我们这里将cookieSecure改为false ,
cookieMaxAge改为3600

修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml

找到下面配置

<bean    p:cookieSecure="true"  p:cookieMaxAge="-1"  p:cookieName="CASPRIVACY"  p:cookiePath="/cas" />

值得注意的是:我们这里将cookieSecure改为false , cookieMaxAge改为3600

配置完http方式访问之后页面上的提示还是存在的,如果我们之后会对登录界面样式完全改版,所以可以不用管它。如果还是需要把它去掉的话,cas统一认证的登陆页面位于:cas目录/WEB-INF/view/jsp/default文件夹里,其中ui/casLoginView.jsp为登陆页面。我们找到这段代码删掉即可。

<c:if test="${not pageContext.request.secure}">  <div  >    <h2>Non-secure Connection</h2>    <p>You are currently accessing CAS over a non-secure connection.  Single Sign On WILL  NOT WORK.  In order to have single sign on work, you MUST log in over HTTPS.</p>  </div></c:if>

1.开源单点登录系统CAS入门

1.1什么是单点登录

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

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

tokenticket.

1.2什么是CAS

CAS是Yale大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。CAS具有以下特点:

【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。下图是CAS最基本的协议过程:

图片 5

SSO单点登录访问流程主要有以下步骤:

1.访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2.定向认证:SSO客户端会重定向用户请求到SSO服务器。

3.用户认证:用户身份认证。

4.发放票据:SSO服务器会产生一个随机的Service Ticket。

5.验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

6.传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

ST:(service
tickect)用于验证CAS的客户端是否是真正的客户端。

TGT:用户证明自己在CAS服务端登录过,存在cookie保存起来的。

1.3 CAS服务端部署

Cas服务端其实就是一个war包。

博主已经整理好资源 下载直接用
链接:

cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入

注:启动登录成功之后务必把cas.war删除掉

图片 6

这里有个固定的用户名和密码 casuser /Mellon

登录成功后会跳到登录成功的提示页面

图片 7

1.4 CAS服务端配置

1.4.1端口修改

如果我们不希望用8080端口访问CAS,可以修改端口

修改TOMCAT的端口

打开tomcat目录conf\server.xml找到下面的配置

图片 8

将端口8080,改为89

修改CAS配置文件

修改CAS配置文件

修改cas的WEB-INF/cas.properties

server.name=http://localhost:89

1.4.2去除https认证

CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买)。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

修改cas的WEB-INF/deployerConfigContext.xml

找到下面的配置

<bean
p:httpClient-ref="httpClient"/>

这里需要增加参数p:requireSecure=”false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用

修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

找到下面配置.

<bean

p:cookieSecure="true"

p:cookieMaxAge="-1"

p:cookieName="CASTGC"

p:cookiePath="/cas" />

参数p:cookieSecure=”true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。

参数p:cookieMaxAge=”-1″,是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。

我们这里将cookieSecure改为false ,
cookieMaxAge改为3600

(3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml

找到下面配置

<bean
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />

我们这里将cookieSecure改为false ,
cookieMaxAge改为3600

值得注意的是:

配置完http方式访问之后页面上的提示还是存在的,如果我们之后会对登录界面样式完全改版,所以可以不用管它。如果还是需要把它去掉的话,cas统一认证的登陆页面位于:cas目录/WEB-INF/view/jsp/default文件夹里,其中ui/casLoginView.jsp为登陆页面。我们找到这段代码删掉即可。

<c:if test=”${not
pageContext.request.secure}”>

<div >

<h2>Non-secure Connection</h2>

<p>You are currently accessing CAS over a
non-secure connection.Single Sign On WILLNOT WORK.In order to have
single sign on work, you MUST log in over HTTPS.</p>

</div>

</c:if>

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注