扩展 CAS Server 界面
CAS 提供了 2 套默认的页面,分别为“ default ”和“ simple ”,分别在目录“ cas/WEB-INF/view/jsp/default ”和“ cas/WEB-INF/view/jsp/simple ”下。其中 default 是一个稍微复杂一些的页面,使用 CSS,而 simple 则是能让 CAS 正常工作的最简化的页面。
在 部署 CAS 之前,我们可能需要定制一套新的 CAS Server 页面,添加一些个性化的内容。最简单的方法就是拷贝一份 default 或 simple 文件到“ cas/WEB-INF/view/jsp ”目录下,比如命名为 newUI,接下来是实现和修改必要的页面,有 4 个页面是必须的:
casConfirmView.jsp: 当用户选择了“ warn ”时会看到的确认界面
casGenericSuccess.jsp: 在用户成功通过认证而没有目的Service时会看到的界面
casLoginView.jsp: 当需要用户提供认证信息时会出现的界面
casLogoutView.jsp: 当用户结束 CAS 单点登录系统会话时出现的界面
CAS 的页面采用 Spring 框架编写,对于不熟悉 Spring 的使用者,在修改之前需要熟悉该框架。
页 面定制完过后,还需要做一些配置从而让 CAS 找到新的页面,拷贝“ cas/WEB-INF/classes/default_views.properties ”,重命名为“ cas/WEB-INF/classes/ newUI_views.properties ”,并修改其中所有的值到相应新页面。最后是更新“ cas/WEB-INF/cas-servlet.xml ”文件中的 viewResolver,将其修改为如清单 9 中的内容。
清单 9. 指定 CAS 页面
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:order="0">
<property name="basenames">
<list>
<value>${cas.viewResolver.basename}</value>
<value> newUI_views</value>
</list>
</property>
</bean>
部署客户端应用
单 点登录的目的是为了让多个相关联的应用使用相同的登录过程,本文在讲解过程中构造 2个简单的应用,分别以 casTest1 和 casTest2 来作为示例,它们均只有一个页面,显示欢迎信息和当前登录用户名。这 2 个应用使用同一套登录信息,并且只有登录过的用户才能访问,通过本文的配置,实现单点登录,即只需登录一次就可以访问这两个应用。
与 CAS Server 建立信任关系
假设 CAS Server 单独部署在一台机器 A,而客户端应用部署在机器 B 上,由于客户端应用与 CAS Server 的通信采用 SSL,因此,需要在 A 与 B 的 JRE 之间建立信任关系。
首先与 A 机器一样,要生成 B 机器上的证书,配置 Tomcat 的 SSL 协议。其次,下载http://blogs.sun.com/andreas/entry/no_more_unable_to_find 的 InstallCert.java,这个文件下来后是源代码,还需执行“javac InstallCert.java”,生成InsallCert.class,InstallCert$SavingTrustManager.class这两个文件,然后运行“ java InstallCert compA:8443 ”命令,并且在接下来出现的询问中输入 1。这样,就将 A 添加到了 B 的 trust store 中。如果多个客户端应用分别部署在不同机器上,那么每个机器都需要与 CAS Server 所在机器建立信任关系。
配置 CAS Filter
准 备好应用 casTest1 和 casTest2 过后,分别部署在 B 和 C 机器上,由于 casTest1 和casTest2,B 和 C 完全等同,我们以 casTest1 在 B 机器上的配置做介绍,假设 A 和 B 的域名分别为 domainA 和 domainB。
将 cas-client-java-2.1.1.zip 改名为 cas-client-java-2.1.1.jar 并拷贝到 casTest1/WEB-INF/lib目录下,修改 web.xml 文件,添加 CAS Filter,如清单 10 所示:
清单 10. 添加 CAS Filter
<web-app>
...
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://domainA:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://domainA:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>domainB:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/protected-pattern/*</url-pattern>
</filter-mapping>
...
</web-app>
对于所有访问满足 casTest1/protected-pattern/ 路径的资源时,都要求到 CAS Server 登录,如果需要整个 casTest1 均受保护,可以将 url-pattern 指定为“/*”。
从清单 10 可以看到,我们可以为 CASFilter 指定一些参数,并且有些是必须的,表格 1 和表格 2 中分别是必需和可选的参数:
表格 1. CASFilter 必需的参数
参数名 作用
edu.yale.its.tp.cas.client.filter.loginUrl 指定 CAS 提供登录页面的 URL
edu.yale.its.tp.cas.client.filter.validateUrl 指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL
edu.yale.its.tp.cas.client.filter.serverName 指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定
edu.yale.its.tp.cas.client.filter.serviceUrl 该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址
表格 2. CASFilter 可选参数
参数名 作用
edu.yale.its.tp.cas.client.filter.proxyCallbackUrl 用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址
edu.yale.its.tp.cas.client.filter.authorizedProxy 用 于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate
edu.yale.its.tp.cas.client.filter.renew 如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过
edu.yale.its.tp.cas.client.filter.wrapRequest 如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名
edu.yale.its.tp.cas.client.filter.gateway 指定 gateway 属性
传递登录用户名
CAS 在登录成功过后,会给浏览器回传 Cookie,设置新的到的 Service Ticket。但客户端应用拥有各自的 Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?CAS Client 的 Filter 已经做好了处理,在登录成功后,就可以直接从 Session 的属性中获取,如清单 11 所示:
清单 11. 在 Java 中通过 Session 获取登录用户名
// 以下两者都可以
session.getAttribute(CASFilter.CAS_FILTER_USER);
session.getAttribute("edu.yale.its.tp.cas.client.filter.user");
在 JSTL 中获取用户名的方法如清单 12 所示:
清单 12. 通过 JSTL 获取登录用户名
<c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>
另 外,CAS 提供了一个 CASFilterRequestWrapper 类,该类继承自HttpServletRequestWrapper,主要是重写了 getRemoteUser() 方法,只要在前面配置 CASFilter 的时候为其设置“ edu.yale.its.tp.cas.client.filter.wrapRequest ”参数为 true,就可以通过 getRemoteUser() 方法来获取登录用户名,具体方法如清单 13 所示:
清单 13. 通过 CASFilterRequestWrapper 获取登录用户名
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
out.println("The logon user:" + reqWrapper.getRemoteUser());
效果
在 casTest1 和 casTest2 中,都有一个简单 Servlet 作为欢迎页面 WelcomPage,且该页面必须登录过后才能访问,页面代码如清单 14 所示:
清单 14. WelcomePage 页面代码
public class WelcomePage extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Welcome to casTest2 sample System!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Welcome to casTest1 sample System!</h1>");
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
out.println("<p>The logon user:" + reqWrapper.getRemoteUser() + "</p>");
HttpSession session=request.getSession();
out.println("<p>The logon user:" +
session.getAttribute(CASFilter.CAS_FILTER_USER) + "</p>");
out.println("<p>The logon user:" +
session.getAttribute("edu.yale.its.tp.cas.client.filter.user") + "</p>");
out.println("</body>");
out.println("</html>");
}
}
在上面所有配置结束过后,分别在 A, B, C上启动 cas, casTest1 和 casTest2,按照下面步骤来访问 casTest1 和 casTest2:
打开浏览器,访问 http://domainB:8080/casTest1/WelcomePage ,浏览器会弹出安全提示,接受后即转到 CAS 的登录页面,如图所示:
登录成功后,再重定向到 casTest1 的 WelcomePage 页面,如图 所示:
可以看到图 中地址栏里的地址多出了一个 ticket 参数,这就是 CAS 分配给当前应用的 ST(Service Ticket)。
再在同一个浏览器的地址栏中输入 http://domainC:8080/casTest2/WelcomePage ,系统不再提示用户登录,而直接出现如图 4 所示的页面,并且显示在 casTest1 中已经登录过的用户。
重新打开一个浏览器窗口,先输入 http://domainC:8080/casTest2/WelcomePage ,系统要求登录,在登录成功过后,正确显示 casTest2 的页面。之后再在地址栏重新输入 http://domainB:8080/casTest1/WelcomePage ,会直接显示 casTest1 的页面而无需再次登录。
分享到:
相关推荐
### CAS SSO配置文档详解 #### 一、SSO实现原理与CAS的作用 单点登录(Single Sign-On,简称SSO)是一种用户身份验证机制,允许用户在一个安全领域内访问多个应用系统,而无需多次输入身份验证信息。在税务行业...
注意保存好这个证书别名,因为后续配置会用到。 - 创建一个名为`keys`的文件夹于`D:`盘下,用于存放生成的证书文件。 - 需要在`C:\Windows\system32\drivers\etc\hosts`文件中添加服务器的域名并映射到本机IP地址...
下面将详细介绍CAS的工作原理、核心概念以及配置流程。 #### 一、CAS工作原理 CAS的核心机制基于以下三个概念: - **TGT (Ticket-Granting Ticket)**:由CAS服务器端产生的授权令牌,用于后续服务间的验证。 - **...
### CAS单点登录配置步骤详解 #### 一、配置SSL **1.1 生成证书** 首先,为了确保数据传输的安全性,我们需要配置SSL。在配置SSL的过程中,第一步是生成证书。这一步骤可以通过Java提供的`keytool.exe`工具来完成...
### Exchange Server 2010 安装及CAS服务器配置 #### 一、Exchange Server 2010 安装前的准备工作 在正式安装Exchange Server 2010之前,需要确保网络环境符合一定的...这为后续更高级的功能配置奠定了坚实的基础。
- **配置CASClient**:为了使Web应用能够与CASServer进行交互,需要在应用中添加CASClient的依赖,并配置其与CASServer的连接信息。 - **Filter配置**:CASClient通常通过Filter的形式集成到Web应用中。这意味着每次...
本配置指南涉及的CAS版本如下: - **服务端**:cas-server-3.4.7 - **客户端**:cas-client-3.2.0 对于服务端而言,仅需解压`cas-server-webapp-3.4.7.war`文件即可,无需额外的源代码。客户端方面,主要使用的组件...
### CAS单点登录配置手册详解 #### 一、Yale CAS 概述 CAS (Central Authentication Service) 是由美国耶鲁大学发起的一项开源项目,它致力于为Web应用系统提供可靠且安全的单点登录(Single Sign-On, SSO)解决...
TGT(Ticket Granting Ticket)是CAS为成功验证的用户提供的一次性凭证,用于后续的SSO请求。ST(Service Ticket)是基于TGT生成的,用于向特定的服务提供认证信息。票证的生命周期、安全性和缓存策略都在配置中设定...
- 接下来需要为CAS客户端生成相应的密钥库文件,这部分内容将在后续章节中详细介绍。 #### 总结 通过上述步骤,我们已经完成了CAS服务端的基本配置,包括生成服务器密钥文件、服务端证书文件以及配置Tomcat支持...
整个过程中,通信通过SSL协议保证安全,用户只需参与首次登录,后续访问由CAS Client与Server之间的交互完成,透明化用户体验。 3. CAS服务端配置 配置CAS Server主要包括以下步骤: 1)环境准备:确保JDK 1.6及...
然后在Spring Boot应用中,需要添加对CAS客户端库的依赖,并创建一个CAS配置类,用于设置CAS服务器的URL、服务验证URL等参数。通过`CasAuthenticationProvider`,Spring Security可以与CAS服务器通信,进行用户的...
- TGT:用户首次登录时,CAS服务器生成的会话票据,存储在用户的浏览器中,用于后续的单点登出(Single Sign-Out, SSO)和二次认证。 2. CAS工作原理: - 用户尝试访问受保护的服务。 - 服务将用户重定向到CAS...
### CAS服务器新增硬盘配置案例详解 #### 背景介绍 在现代企业的IT环境中,随着业务量的增长,服务器资源的需求也随之增加。对于采用H3C CAS(CloudServer Operating System)虚拟化平台的企业而言,当遇到CVK...
4. **Ticket Granting Ticket (TGT)**:用户首次登录时,CAS服务器生成的全局认证票证,可用于获取后续的服务票证。 5. **Service Ticket (ST)**:针对特定服务的票证,由TGT换取,用于证明用户已通过CAS服务器的...
- 配置Web.xml:在Web应用的配置文件中,我们需要配置CAS过滤器链,包括`CasAuthenticationFilter`、`TicketValidationFilter`和`CasHttpServletRequestWrapperFilter`,这些过滤器负责拦截请求、验证票据并创建...
若无异常,表明SSL配置正确,为后续的CAS Server与Acegi Security整合提供了必要的环境。 #### 配置CAS Server的用户认证 重新配置CAS Server的用户认证部分,主要是修改`deployerConfigContext.xml`文件,增加...
6. **部署和集成**:CAS可以通过修改配置文件轻松地与新的Web应用集成,只需要在客户端配置中指定CAS服务器的位置,以及应用的验证URL。 7. **安全性**:CAS通过HTTPS提供安全的通信,防止中间人攻击,并且可以通过...
2. TGT:Ticket Granting Ticket是CAS服务器为用户成功验证后生成的一次性票据,用户后续访问其他受保护的应用时,只需提供这个TGT,而无需再次输入凭证。 3. 服务验证:当用户尝试访问一个受CAS保护的应用时,应用...