首先说明的是,本文提供的是一个快速上手的实例,并不打算详细阐述单点登录的概念和CAS的工作原理。这也是本人平时学习的习惯:不管什么技术,先把环境搭起来,从最简单的Hello World逐步到其背后的Why-What-How。
单点,至少我们得跨域吧,所以我这里部署了三个系统到三个Tomcat下:
应用 | 域名 | Tomcat端口 | 作用 | 来源 |
---|---|---|---|---|
CAS Server | cas-server.com | 38080 | 中央认证服务 | 官网下载 |
web-one | cas-app1.com | 18080 | 接入系统1 | 自定义 |
web-one | cas-app2.com | 28080 | 接入系统2 | 自定义 |
实现不同域名的模拟,只需配置hosts文件:
\System32\drivers\etc\hosts
127.0.0.1 cas-app1.com
127.0.0.1 cas-app2.com
127.0.0.1 cas-server.com
1 下载CAS Server
下载地址:https://www.apereo.org/projects/cas/download-cas
当前使用的是3.5.0版本
2 获取CAS Server部署包
使用cas server的方法有两种:
不管用哪种方式,都是一样的,只是cas帮我们打好了包而已,第2种导入Eclipse便于我们调试和修改代码。
3 修改配置
1 WEB-INF/cas.properties
只需修改cas server部署的Tomcat的访问路径即可:
server.name=http://cas-server:38080
2 WEB-INF/deployerConfigContext.xml
为了简单起见,我们不启用HTTPS,添加requireSecure为false:
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false" />
3 ticketGrantingTicketCookieGenerator.xml
同样添加cookieSecure为false:
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
4 warnCookieGenerator.xml
同样添加cookieSecure为false:
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
4 启动Tomcat
修改配置后,我们就可以启动部署了CAS Server的Tomcat了。
前面配置了hosts文件,直接访问http://cas-server.com:38080/cas/
,不出意外我们会看到默认的登录页面:
因为cas server默认使用的给我们演示用的认证处理器,我们只需输入账号密码都是相同的字符串,即表示登录凭据是正确的,如我们输入”test/test”,就能看到登录成功的页面:
到此为止,我们完成了CAS Server的部署,也就是认证中心已经部署好了。
1 新建项目
用Eclipse快速新建两个maven的webapp项目
2 配置项目
1 pom.xml
整合cas,肯定得用到cas的代码吧,所以在pom中引入cas客户端:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
2 web.xml
要登录拦截,肯定得靠过滤器,所以在web.xml中配置一系列的Filter。具体哪些Filter可以暂时不关心,只需配置几个URL即可,serverName就是我们当前的接入系统,casServer就是CAS Server认证中心:
<!-- ======================== start ======================== -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<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>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://cas-server.com:38080/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://cas-app1.com:18080/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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://cas-server.com:38080/cas/</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://cas-app1.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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 Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== end ======================== -->
3 启动Tomcat
访问http://cas-app1.com:18080/web-one/
,不出所料的话,应该会自动重定向到cas登录页面:
尤其注意这里的URL。
随便输入账号密码相同做登录,即可认证通过成功访问web1的页面:
然后访问http://cas-app2.com:28080/web-two/
,不会重定向到登录页面,直接到web2的页面:
访问cas认证中心cas-server.com:38080/cas/
,也是直接到登录成功的页面:
如果要单点注销登录,直接访问http://cas-server.com:38080/cas/logout
:
到此为止,三个系统的最最基本的单点登录功能整合完成了。
1.没有使用https
2.登录页面的风格是cas,如何自定义
3.账号密码不是从数据库中读取的
4.这里只有登录凭据认证,权限该如何处理?