Central Authentication Service(CAS)

Central Authentication Service(CAS)之一(note)

 

CAS作为一个授权服务应用,分为服务器和客户端两个部分,与其相关联的东西也挺多的,我接触到的主要有JDK、Tomcat、SSL、LDAP、SSO、Weblogic。

要成功地使CAS成为其他各种应用的用户的统一认证中心,就要正确的配置好CAS的服务端和客户端,在每一个需要认证的应用里面都要分别配置客户端,与其相关的东西当然也要配置好。

注意:

1.使用actually computer name而非localhost或ip;

2.实现单点登录(SSO)必须使用SSL,https协议;在自己的开发环境里面,可以通过“self-certify”方式来完成SSL事务;生产环境要对外网认证,则必须购买第三方的证书,比如Verisign等。

3.明确tomcat使用的JRE的位置,设置好环境变量JAVA_HOME;

4.认证机制,客户端发出登录请求,统一跳到CAS服务端认证,通过认证的用户的id(用户名或email)会被服务端暴露出来,返回给客户端;接下来通过认证的用户有哪些权限访问客户端应用的那些资源?记住CAS服务端不会(也不应该)管这些事。CAS服务端只是让这个用户进门(或拒之门外)。授权是通过客户端应用来实现的。客户端应用甚至(也应该)获取不到用户登录时的密码。客户端应用需要根据唯一的用户名赋予该用户角色和权限(授权)。

5. CAS是opensource ,可以根据需要修改任何地方,最常改的就是登录和登出界面。 

实际上这个开源软件有专门的网站介绍CAS及其相关的配置。http://www.jasig.org/cas


Central Authentication Service(CAS)之二(server)

服务端和客户端为了节省资源,可以配置在同一台机器上,但为了便于区分,我们可以想像他们是配置在不同的机器上的,而且把它们的配置步骤完全分开。先从服务端的配置说起:

 

1.       服务端装好了JDK,假设路径在D:/sso/apps/jdk150_06 下,JAVA_HOME用该值设置好;

2.       Tomcat的安装唯一注意的就是JRE选择D:/sso/apps/jdk150_06/jre;

3.       用keytool生成证书时,computer name为必填,其余随意。 然后导出到server.crt,最后将存在server.crt里面的证书导入到 ../jre/lib/security/cacerts. 这时cacerts就可以为Tomcat所用了。保存好server.crt供客户端导入。详细如下:

D:/sso/apps/jdk150_06/bin>keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
输入keystore密码:  changeit
您的名字与姓氏是什么?
  [Unknown]:  yejia
您的组织单位名称是什么?
  [Unknown]:  hp
您的组织名称是什么?
  [Unknown]:  GDCC
您所在的城市或区域名称是什么?
  [Unknown]:  ShangHai
您所在的州或省份名称是什么?
  [Unknown]:  SH
该单位的两字母国家代码是什么
  [Unknown]:  cn
CN=yejia, OU=hp, O=GDCC, L=ShangHai, ST=SH, C=cn 正确
吗?
  [否]:  y


D:/sso/apps/jdk150_06/bin>keytool -export -alias tomcat -keypass changeit -file server.crt
输入keystore密码:  changeit
保存在文件中的认证 <server.crt>

D:/sso/apps/jdk150_06/bin>keytool -import -file server.crt -keypass changeit -keystore ../jre/lib/security/cacerts
输入keystore密码:  changeit
Owner: CN=yejia, OU=hp, O=GDCC, L=ShangHai, ST=SH, C=cn
发照者: CN=yejia, OU=hp, O=GDCC, L=ShangHai, ST=SH,C=cn
序号: 4aaf8e42
有效期间: Tue Sep 15 20:53:22 GMT+08:00 2009 至: Mon Dec 14 20:53:22 GMT+08:00 2009
认证指纹:
         MD5:  CF:BB:4C:6B:76:44:C6:41:C4:74:86:F5:06:D7:FB:86
         SHA1: D3:ED

4.       Andreas Sterbenz有一篇博客,是导入或测试证书是否导入成功的一种很优雅的做法。

地址:http://blogs.sun.com/andreas/entry/no_more_unable_to_find

务必用上面blog提供的InstallCert.java将证书成功导入到%JAVA_HOME%/jre/lib/security/cacerts,所以前面的环境变量JAVA_HOME务必先设置好了。出现类似于以下结果,才说明证书导入成功了:

% java InstallCert ecc.fedora.redhat.com
Loading KeyStore jssecacerts...
Opening connection to ecc.fedora.redhat.com:443...
Starting SSL handshake...

No errors, certificate is already trusted

Server sent 2 certificate(s):

 1 Subject CN=ecc.fedora.redhat.com, O=example.com, C=US
   Issuer  CN=Certificate Shack, O=example.com, C=US
   sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7
   md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54

 2 Subject CN=Certificate Shack, O=example.com, C=US
   Issuer  CN=Certificate Shack, O=example.com, C=US
   sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6
   md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68

Enter certificate to add to trusted keystore or 'q' to quit: [1]
q
KeyStore not changed

 

5.       修改Tomcat的配置文件server.xml,开通端口8443和https协议。

<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->

<Connector port="8443" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true"

acceptCount="100" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS"

keystoreFile="C:/Documents and Settings/yejia/.keystore"

keystorePass="changeit"

truststoreFile=" D:/sso/apps/jdk150_06 /jre/lib/security/cacerts" />

 

6.       cas-server-3.3.2/modules目录下的cas-server-webapp-3.3.2.war重命名为cas.war,然后copy and pastetomcatwebapps下面,启动Tomcat会自动发布。然后在IE输入https://yejia:8443/cas/login就可以验证是否发布成功了,输入相同的用户名和密码(cas/cas)就会返回成功的提示页面。要修改页面的显示,到Tomcatwebapps下面,cas/WEB-INF/view/jsp/default/ui下面的jsp页面去修改。

7.       很显然我们使用CAS统一认证,用其自带的默认用户名密码机制是行不通的,一般的做法是把所有用户信息放在LDAP服务器上,CAS通过配置LDAP来获取并验证用用户。

Central Authentication Service(CAS)之三(LDAP)

LDAP服务器可以装在不同的机器上,CAS通过配置URL来访问它,下面看看CASLDAP服务器结合起来要如何配置:

1.      可以去apache下载最新的apache directory server1.5.5,地址是:http://directory.apache.org/ apache directory server1.5.5可以作为LDAP服务器。下好后安装好。

2.      同样到http://directory.apache.org/ 下载并安装apache directory studio1.4.0

3.      为了简化,可以简单的添加几个用户在默认的ou=system下面, objectClass选择inetOrgPerson。导出的ldif文件:

dn: uid=pt01,ou=system
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
cn: user
sn: user
uid: pt01
userPassword:: MTIz

dn: uid=pt02,ou=system
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
cn: user
sn: user
uid: pt02
userPassword:: MTIz

 

 

4.      CAS3.3.2 已经没有支持LDAP的类了,所以得添加“Spring-LDAP support package”。“spring-ldap-1.3.0.RELEASE-all.jar 可以在spring的官方网站上找到。

5.      再添加“ cas-server-support-ldap-3.3.2.jar”可以在cas-server-3.3.2/modules目录下找到。

6.      打开目录D:/sso/apps/Tomcat6/webapps/cas/WEB-INF 找到配置文件“deployerConfigContext.xml”,我们要将“SimpleTestUsernamePasswordAuthenticationHandler”替换成“FastBindLdapAuthenticationHandler”,分两步完成:

a)      添加一个contextSource

<bean id="contextSource"

                                  class="org.springframework.ldap.core.support.LdapContextSource">

                                  <property name="pooled" value="true"/>

                                  <property name="urls">

                                    <list>

                                      <value>ldap://gbpccmm1.asiapacific.hpqcorp.net:10389</value>

                                    </list>

                                  </property>

                                 

                                    <property name="userDn" value="{cn=bind_user_goes_here}"/>

                                                <property name="password" value="{bind_user_password_goes_here}"/>

                                                <property name="baseEnvironmentProperties">

                                    <map>

                                      <entry key="java.naming.security.authentication" value="simple" />

                                    </map>

                                  </property>

                </bean>

 

b)      替换掉原有的Handler

 

<bean                                                   class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

 

Replace it with

<bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler">

                                <property name="filter" value="uid=%u,ou=system" />

                                <property name="contextSource" ref="contextSource" />

</bean>

 

7.      重新启动Tomcat,检查log确保没有错误。

8.      用先前设置的用户信息测试一遍,打开https://yejia:8443/cas/login pt02/123或者pt01/123登录看是否能有成功提示。

Central Authentication Service(CAS)之四(Client)


服务端的配置弄好了,客户端的添加就很简单了。假如有一个应用CasDemo要通过CAS服务端的统一认证,CasDemo要做的就仅仅是添加cas相应的客户端jar包,并在web.xml里面添加相应的filter就好了。最后给用户授权这一步需要根据应用的实际情况来实现。

 

 

1.       假设这个应用是在不同于CAS服务端的另一台电脑上,那么我们要把之前服务端生成的认证server.crt导入到这边来。将server.crt拷贝到%JAVA_HOME%/jre/lib/security/cacerts

然后再目录%JAVA_HOME%/bin下执行如下命令:

keytool -import -file server.crt -keypass changeit -keystore ../jre/lib/security/cacerts

接着用InstallCert.java验证直到导入成功。(http://blogs.sun.com/andreas/entry/no_more_unable_to_find

2.       WEB-INF/lib下添加如下jar包cas-client-core-3.1.3.jar,commons-codec-1.3.jar, commons-collections-3.2.jar,commons-lang-2.2.jar,commons-logging-1.1.jar

3.       Modify WEB-INF/web.xml.添加如下的配置

 

<!--CAS Authentication FILTER -->
 <filter>
  <filter-name>CAS Authentication Filter</filter-name>
  <filter-class>
   org.jasig.cas.client.authentication.AuthenticationFilter
  </filter-class>
  <!-- cas server LOGIN URL -->
  <init-param>
   <param-name>casServerLoginUrl</param-name>
   <param-value>
    https://gbpccmm1.asiapacific.hpqcorp.net:8443/cas/login
   </param-value>
  </init-param>
  <!-- local web URL -->
  <init-param>
   <param-name>serverName</param-name>
   <param-value>http://JYE1.asiapacific.hpqcorp.net:8080</param-value>
  </init-param>
 </filter>
 <!-- CAS Validation FILTER -->
 <filter>
  <filter-name>CAS Validation Filter</filter-name>
  <filter-class>
   org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
  </filter-class>
  <!-- CAS SERVER URL -->
  <init-param>
   <param-name>casServerUrlPrefix</param-name>
   <param-value>https://gbpccmm1.asiapacific.hpqcorp.net:8443/cas</param-value>
  </init-param>
  <!-- LOCAL web URL -->
  <init-param>
   <param-name>serverName</param-name>
   <param-value>http://JYE1.asiapacific.hpqcorp.net:8080</param-value>
  </init-param>
  <!-- if validation false throw exception ; default true-->
  <init-param>
   <param-name>exceptionOnValidationFailure</param-name>
   <param-value>false</param-value>
  </init-param>
  <!-- the URL to watch for PGTIOU/PGT responses from the CAS server -->
  <init-param>
   <param-name>allowedProxyChains</param-name>
   <param-value>http://JYE1.asiapacific.hpqcorp.net:8080/jsp/cas/index.jsp</param-value>
  </init-param>
 </filter>
 <!-- cas security username on request.getRemoteUser() -->
 <filter>
  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  <filter-class>
   org.jasig.cas.client.util.HttpServletRequestWrapperFilter
  </filter-class>
 </filter>
 <!-- CAS SINGLE SIGN OUT FILTER -->
 <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-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 Wrapper Filter</filter-name>
  <url-pattern>/jsp/cas/index.jsp</url-pattern>
 </filter-mapping>

 <!-- SingleSignOutHttpSessionListener LISTENER -->
 <listener>
  <listener-class>
   org.jasig.cas.client.session.SingleSignOutHttpSessionListener
  </listener-class>
 </listener>
 <welcome-file-list>
  <welcome-file>jsp/cas/index.jsp</welcome-file>
 </welcome-file-list>

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值