一.配置证书
首先,打开cmd,将路径指到c盘跟目录(其实指到哪里无所谓,主要是好找)。
1.
配置
CAS
服务器端
CAS服务器端一般指一个单独的应用,并且为独立的服务器。客户端的应用需要验证时直接到CAS服务器端的机器上验证。
● 生成服务端密匙
keytool -genkey -alias casserver -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore
记住,当他问你你的您的名字与姓氏是什么?一定要输入
cas
所在服务器端的机器名或者更是域名,比如
cas
所在的服务器端的机器名字是
hostabc
那么,这里输入的名字与姓氏就是
hostabc
。如果你的服务器已经指定了域名,那么,输入的名字与姓氏就是这个域名,其它的可以不填。
● 生成服务端证书
keytool -export -alias casserver -storepass changeit -file server.cer -keystore server.keystore
将会生成一个
server.cer
文件。
● 将服务器端证书文件导入到cacerts 文件中
keytool -import -trustcacerts -alias server -file server.cer -keystore cacerts -storepass changeit
将会在
c
盘下产生一个
cacerts
文件,将这个文件,将这个文件拷贝覆盖到
%JAVA_HOME%
/jre/lib/security
中,这样,服务器端的
证书
就配置好了。
● 拷贝cas-server-3.0.6.zip包内的target目录下的cas.war文件到Tomcat目录下的webapps目录下。将生成好的
server.keystore
文件拷贝到
tomcat
的安装目录。
● 修改Tomcat的配置文件server.xml把以下补注释的内容打开
<Connector port="8443" maxHttpHeaderSize="8192"
keystorePass="changeit" keystoreFile="/server.keystore"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
其中红色部分是新添加的内容。注意,
keystoreFile
位置不能写错。
Cas的服务器端整个过程完毕。
说明:其实这里服务器端和客户端的密匙和证书一样,这里写两个是为了能分辨清楚。
2.
配置
CAS
客户端
CAS客户端一般指WEB应用所在的机器。
● 生成客户端密匙(基本步骤与服务器端的一样)
keytool -genkey -alias casclient -keyalg RSA -keypass changeit -storepass changeit -keystore client.keystore
注意这里的客户端密匙也会像生成服务器端的密匙一样,同样会问你你的您的名字与姓氏是什么,这里输入的与服务器端输入的一样就可以了。
● 生成客户端证书
keytool -export -alias casclient -storepass changeit -file client.cer -keystore client.keystore
● 导入客户端证书文件到cacerts 文件中
keytool -import -trustcacerts -alias client -file client.cer -keystore cacerts -storepass changeit
将会生一个
cacerts
文件,将这个文件,将这个文件拷贝覆盖到客户端的
%JAVA_HOME%
/jre/lib/security
中,这样,客户端的
证书
就配置好了。
●
这里的客户端用到
acegi
,也就是说身份验证到
CAS
服务器验证,认证通过返回票根后,权限的指定交由给
acegi
处理。所以要将
acegi
与
CAS
整合,
acegi
提供了与
CAS
客户端整合能力。
●解压缩
acegi-security-1.0.1.zip
,拷贝
acegi-security-sample-tutorial.war
到
%CATALINA_HOME%/webapps
目录下,重启
tomcat
,
acegi-security-sample-tutorial
即已发布。现在我们将其改造为使用
CAS
进行用户的登录和认证。
●
用编辑器打开
WEB-INF/applicationContext-acegi-security.xml
,找到
//
认证处理过滤器,其实他并不真正处理认证,这个过滤器主要是
authenticationManager
,这个是处理认证的真正对象。
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/>
<property name="defaultTargetUrl" value="/"/>
<property name="filterProcessesUrl" value="/j_acegi_security_check"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
将其替换为:
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/>
<property name="defaultTargetUrl" value="/"/>
<property name="filterProcessesUrl" value="/j_acegi_cas_security_check"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
其中,
authenticationFailureUrl
是认证失败时显示的页面,
acegi-security-sample-tutorial
登录失败时会在登录页
(acegilogin.jsp)
显示失败原因,现改为使用
CAS
之后,
acegi-security-sample-tutorial
使用
CAS
的登录页面,故
acegilogin.jsp
可去掉。接下来,找到
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/acegilogin.jsp"/>
<property name="forceHttps" value="false"/>
</bean>
替换为:
<bean class="
org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint
">
<property name="loginUrl">
<value>
https://localhost:8443/cas/login
</value>
</property>
<property name="serviceProperties">
<ref bean="serviceProperties"/>
</property>
</bean>
再接下来,找到
//
authenticationManager
里面包含多个
providers(
供应者
),
这些供应者为
authenticationManager
提供用户信息对象。
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider"/>
<bean class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key" value="changeThis"/>
</bean>
<bean class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="changeThis"/>
</bean>
</list>
</property>
</bean>
将
<ref local="daoAuthenticationProvider"/>
修改为
<ref local="casAuthenticationProvider"/>
,并添加以下
bean
:
<bean id="casAuthenticationProvider" class="org.acegisecurity.providers.cas.CasAuthenticationProvider">
<property name="ticketValidator">
<ref bean="ticketValidator"/>
</property>
<property name="casProxyDecider">
<ref bean="casProxyDecider"/>
</property>
<property name="statelessTicketCache">
<ref bean="statelessTicketCache"/>
</property>
<property name="casAuthoritiesPopulator">
<ref bean="casAuthritiesPopulator"/>
</property>
<property name="key">
<value>some_unique_key</value>
</property>
</bean>
<bean id="
ticketValidator
" class="org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator">
<property name="casValidate">
<value>
https://localhost:8443/cas/proxyValidate
</value>
</property>
<property name="serviceProperties">
<ref bean="serviceProperties"/>
</property>
</bean>
<bean id="
serviceProperties
" class="org.acegisecurity.ui.cas.ServiceProperties">
<property name="service">
<value>
https://localhost:8443/acegi-security-sample-tutorial/j_acegi_cas_security_check
</value>
</property>
</bean>
<bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.RejectProxyTickets"/>
<bean id="statelessTicketCache" class="org.acegisecurity.providers.cas.cache.EhCacheBasedTicketCache">
<property name="cache">
<bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
</property>
<property name="cacheName" value="userCache"/>
</bean>
</property>
</bean>
<bean id="casAuthritiesPopulator" class="org.acegisecurity.providers.cas.populator.DaoCasAuthoritiesPopulator">
<property name="userDetailsService">
<ref bean="userDetailsService"/>
</property>
</bean>
注意
:
org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint
的地方里面有个
loginUrl
,这个
url
是当点击受保护页面时,如果没有验证身份时所跳转到的
cas
服务器端的登陆页面,里面的地址必须指定到
CAS
服务器端的机器名或者是域名,就是生成服务器端证书时的那个
您的名字与姓氏是什么?所输入的内容。
ticketValidator
也同样。
而
serviceProperties
里面的
service
是登陆成功后会返回到客户端登陆前的页面,所以这里的
localhost
一般不变或者是客户端的
IP
地址。
客户端完毕。