添加cas-client的jar包
下载cas-client,地址:http://www.ja-sig.org/downloads/cas-clients/,当前最新版本是cas-client-3.2.1-release.zip。然后解压cas-client-3.2.1-release.zip,在modules拷贝cas-client-core-3.2.1.jar到应用的WEB-INF/lib目录中。
撰写支持CAS集成的客户化包
除了在web.xml添加CAS内置的filter外(具体看配置web.xml),我们需要撰写自己支持CAS集成的客户化包。大致思路如下:
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest)servletRequest;
- HttpServletResponse response = (HttpServletResponse)servletResponse;
- HttpSession session = request.getSession();
- //在session中自定义一个参数,以它来校验是否完成过自动登陆
- Object user_login = session.getAttribute(AURORA_USER_LOGIN);
- if (user_login != null){
- //登陆过,就继续执行其他filter
- filterChain.doFilter(request, response);
- return;
- }
- //通过CAS的API获得登陆账号
- String loginName = AssertionHolder.getAssertion().getPrincipal().getName();
- try {
- //执行本系统的登陆。跟平常同时校验用户名和密码不同,这里只有用户名。
- executeLoginProc(request,response,loginName);
- } catch (Exception e) {
- logger.log(Level.SEVERE, "executeLoginProc error:", e);
- return;
- }
- //登陆成功
- session.setAttribute(AURORA_USER_LOGIN, Boolean.TRUE);
- //跳转到登陆成功后的页面
- response.sendRedirect(roleSelectPageUrl);
- }
把这个class打包成一个jar拷贝到应用的WEB-INF/lib目录中。
如果有兴趣,还可以简单了解下org.jasig.cas.client.authentication.AuthenticationFilter这个CAS内置filter的功能
- <p>public final void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest)servletRequest;
- HttpServletResponse response = (HttpServletResponse)servletResponse;
- HttpSession session = request.getSession(false);
- //检查自定义属性"_const_cas_assertion_"
- Assertion assertion = session != null ? (Assertion)session.getAttribute("_const_cas_assertion_") : null;</p><p> if (assertion != null) {
- //已经成功登陆过CAS
- filterChain.doFilter(request, response);
- return;
- }
- //拿到url,并检查url参数中的ticket是否有效
- String serviceUrl = constructServiceUrl(request, response);
- String ticket = CommonUtils.safeGetParameter(request, getArtifactParameterName());
- boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);</p><p> if ((CommonUtils.isNotBlank(ticket)) || (wasGatewayed)) {
- //ticket有效
- filterChain.doFilter(request, response);
- return;
- }</p><p> this.log.debug("no ticket and no assertion found");
- String modifiedServiceUrl;
- String modifiedServiceUrl;
- if (this.gateway) {
- this.log.debug("setting gateway attribute in session");
- modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);
- } else {
- modifiedServiceUrl = serviceUrl;
- }</p><p> if (this.log.isDebugEnabled()) {
- this.log.debug("Constructed service url: " + modifiedServiceUrl);
- }</p><p> String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);</p><p> if (this.log.isDebugEnabled()) {
- this.log.debug("redirecting to \"" + urlToRedirectTo + "\"");
- }
- //重定向到cas的登陆页面
- response.sendRedirect(urlToRedirectTo);
- }
- </p>
修改web.xml
在应用WEB-INF/web.xml添加filter的内容,效果如下所示
- <!-- ======================== 单点登录开始 ======================== -->
- <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
- <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>CASFilter</filter-name>
- <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
- <init-param>
- <param-name>casServerLoginUrl</param-name>
- <param-value>https://sso.aurora-framework.org:8080/cas/login</param-value>
- <!--这里的server是服务端的IP-->
- </init-param>
- <init-param>
- <param-name>serverName</param-name>
- <param-value>https://sso.aurora-framework.org:8080</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CASFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
- <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>https://sso.aurora-framework.org:8080/cas</param-value>
- </init-param>
- <init-param>
- <param-name>serverName</param-name>
- <param-value>https://sso.aurora-framework.org:8080</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CAS Validation Filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!--
- 该过滤器负责实现HttpServletRequest请求的包裹,
- 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
- -->
- <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>
- <!--
- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
- 比如AssertionHolder.getAssertion().getPrincipal().getName()。
- -->
- <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>
- <!-- 自动根据单点登录的结果设置本系统的用户信息-->
- <filter>
- <display-name>AutoSetUserAdapterFilter</display-name>
- <filter-name>AutoSetUserAdapterFilter</filter-name>
- <filter-class>aurora.plugin.sso.cas.AutoSetUserFilter</filter-class>
- <init-param>
- <param-name>roleSelectPageUrl</param-name>
- <param-value>https://sso.aurora-framework.org:8080/yourapp/role_select.screen</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>AutoSetUserAdapterFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- ======================== 单点登录结束 ======================== -->
前面几个都是CAS的标准配置,最后一个AutoSetUserAdapterFilter(自定义,可以取其他任意名字)才是我们支持cas的客户化程序。其中roleSelectPageUrl是指用户完成单点登录后跳转的页面。
本文档撰写时Java web项目和CAS用同一个tomcat,所以都用的https。否则只需要配置CAS的链接为HTTPS,本项目连接用HTTP。
修改CAS的认证逻辑
CAS默认的逻辑是用户名和密码一致就可以登陆,现在需要把原web系统的用户名和密码校验挪到CAS中。这里假设原先web系统中有一张sys_user表存储了用户名和MD5散列后的密码。
打开cas/WEB-INF/deployerConfigContext.xml
- 注释掉SimpleTestUsernamePasswordAuthenticationHandler这个Handler,并添加
- <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
- <property ref="dataSource" name="dataSource"></property>
- <property name="sql" value="select t.encrypted_user_password from sys_user t where t.user_name=?"></property>
- <property ref="MD5PasswordEncoder" name="passwordEncoder"></property>
- </bean>
在文件末尾之前加入数据库的链接:
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName">
- <value>oracle.jdbc.driver.OracleDriver</value>
- </property>
- <property name="url">
- <value>jdbc:oracle:thin:@yourIP:1521:yourOracleInstanceId</value>
- </property>
- <property name="username">
- <value>yourName</value>
- </property>
- <property name="password">
- <value>yourPassword</value>
- </property>
- </bean>
- <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
- <constructor-arg index="0">
- <value>MD5</value>
- </constructor-arg>
- </bean>
cas加入jdbc支持
复制cas-server-3.5.2\modules\cas-server-support-jdbc-3.5.2.jar和Oracle驱动(这里采用oracle数据)的ojdbc14.jar或者classes12.jar放到cas/WEB-INF/lib目录下。重新登陆Web系统
重启tomcat,在浏览器中输入https://sso.aurora-framework.org:8080/yourapp/,自动跳转到如下页面:
输入web系统预先定义的用户名和密码,并跳转到自定义(web.xml中定义的)登陆成功后的页面。
相关推荐
CAS(Central Authentication Service,中央认证服务)是Java社区开发的一个开源SSO解决方案,它为Web应用提供了统一的认证和授权服务。 CAS的核心概念包括以下几个部分: 1. **CAS服务器**:这是SSO的核心,负责...
总的来说,这个项目提供了Java环境下使用Maven构建的CAS SSO解决方案,可以帮助开发者快速搭建一套SSO环境,实现不同应用间的统一登录管理。通过理解服务端和客户端的工作原理以及配置方法,可以灵活地适应各种应用...
4. **Java SSO实现**:介绍如何使用Java CAS客户端库集成到应用程序中,设置服务代理和验证机制。 5. **.NET SSO实现**:如果文档包含这部分,将涵盖在.NET环境中集成CAS的步骤,包括使用.NET CAS客户端库和配置。 6...
CAS(Central Authentication Service)是Java实现的开源SSO解决方案,它为各种应用提供了一个统一的认证中心。本资料包提供了关于CAS的详细知识,包括示例、文档、源码以及必要的库文件。 首先,"CAS.rar"是一个...
总结,这个压缩包提供了集成CAS单点登录到Maven项目所需的全部资源,包括服务端war包和客户端DEMO,是学习和实践SSO技术的好材料。通过深入理解和操作这些内容,你可以更好地掌握CAS的工作原理以及如何在实际项目中...
Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...
《CAS集成手册(Java版)》是一份详细指导文档,主要针对CAS(Central Authentication Service,中央认证服务)在Java环境下的集成与优化。CAS是一种开放源码的单点登录(SSO)系统,旨在简化用户身份验证过程,提高...
CAS项目通常使用Java开发,遵循MVC设计模式,主要组件包括:TicketGranter、AuthenticationManager、ProxyGrantingTicket等。通过阅读源码,我们可以理解如何处理认证请求,生成和验证票据,以及如何实现单点登出...
X2.5与CAS(Central Authentication Service)集成是一种常见的身份验证解决方案,它能够实现单点登录(Single Sign-On, SSO)功能。在SSO系统中,用户只需登录一次,就可以在多个相互独立的应用系统之间自由切换,...
CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...
# sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库...
SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。本项目基于SpringBoot框架,结合Shiro、pac4j和CAS,构建了一个完整的JWT认证中心,...
CAS是一个开源项目,由Jasig组织维护,主要为Web应用提供单点登录功能。CAS的核心机制包括认证服务(CAS Server)和代理服务(CAS Client)两个部分: - **认证服务**:负责用户的认证处理,提供认证逻辑、用户凭证验证...
本项目基于SpringBoot、CAS5.x、Shiro和Pac4j实现了SSO集成,下面将详细阐述这些技术组件以及它们在SSO中的作用。 1. **SpringBoot** SpringBoot是Spring框架的一个子项目,它简化了Spring应用的初始搭建和运行...
标题中的“让CAS支持客户端自定义登陆页面——客户端篇”表明了本文主要探讨的是如何在中央认证服务(Central Authentication Service, CAS)系统中,允许客户端应用程序实现自定义登录页面的配置与实现。CAS是一个...
用J2EE的技术(JSP和Servlet)完成了一个具有Web-SSO的简单样例。样例包含一个身份认证的服务器和两个简单的Web应用,使得这两个 Web应用通过统一的身份认证服务来完成Web-SSO的功能
总之,Yale CAS SSO JAVA Client是实现基于CAS的单点登录解决方案的重要工具,它提供了方便的API和配置选项,帮助Java开发者在不牺牲安全性的前提下,为用户提供无缝的登录体验。通过深入理解和合理利用这些资源,...
CAS(Central Authentication Service)单点登录(Single Sign-On, SSO)是一种网络认证协议,它允许用户通过一次登录,就能访问多个应用系统,无需再次进行身份验证。在本示例中,我们有一个基于SpringMVC的CAS SSO...
单点登录的英文名称为Single Sign-On,简写为SSO,它是一个用户认证的过程,允许用户一次性进行认证之后,就访问系统中不同的应用;而不需要访问每个应用时,都重新输入密码。IBM对SSO有一个形象的解释“单点登录、...
Java Web SSO(Single Sign-On)实现主要涉及的是在多个应用系统之间实现用户单点登录的功能,即用户只需要登录一次,就能在多个相互信任的应用系统中自由切换,无需再次进行身份验证。SSO的核心思想是将认证过程...