为了账号安全,请及时绑定邮箱和手机立即绑定

《SSO CAS单点系列》之 实操!轻松玩转SSO CAS就这么简单(相遇篇)

2016.01.08 15:09 36462浏览
图片描述
作者: 常明,Java架构师
[请尊重原创,盗版必究,转载请指明出处]

CAS是中央认证服务Central Authentication Service的简称。最初由耶鲁大学的Shawn Bayern 开发,后由Jasig社区维护,经过十多年发展,目前已成为影响最大、广泛使用的、基于Java实现的、开源SSO解决方案。

2012年,Jasig和另一个有影响的组织Sakai Foundation合并,组成Apereo。Apereo是一个由高等学术教育机构发起组织的联盟,旨在为学术教育机构提供高质量软件,当然很多软件也被大量应用于商业环境,譬如CAS。目前CAS由Apereo社区维护。

CAS的官方网址是: https://www.apereo.org/projects/cas

工程代码网址:https://github.com/Jasig/cas

前面我们自己亲自动手实现了一个SSO,包括Nebula Server和Nebula Client,对SSO的解决思路也已非常清楚了。那现在理解这个CAS原理就非常容易了,同理,CAS也提供了一个认证中心,叫CAS Server,参与登录的应用系统都会引导到CAS Server进行登录。与Nebula Client类似,各应用系统与CAS Server交互通信的登录组件叫CAS Client。

可能有的读者疑问了,既然我们按照相同原理自己都实现了SSO,为什么还要学习了解CAS?

我们知道,互联网应用及企业应用的SSO具体使用场景和要求往往千差万别,如基于上篇的SSO实现,在具体实现上需要定制化很多场景,也就是说需要一定量的开发定制工作。而成熟开源的CAS,很多情况下,考虑了这些具体场景,直接在框架上面做应用开发比从零基础底层技术开发要轻松的多。

如CAS Client,已经提供了包括Java、.net、php、ruby、perl等多种语言的实现,非常适合异构系统的单点登录使用场景。再比如认证方式,除了常见的基于数据库认证,还提供LDAP使用场景,同时支持各种常见认证协议,如spnego、OpenId、X509等等。

对于全局会话,CAS基于Cookie使用了自己的实现方式,而服务端的会话存储,除了缺省基于内存模式,还提供了基于ehcache、memcached等多种实现,同时提供了灵活接口便于自己定制扩展,这非常适合某些高可用性、高性能的应用场景。

因此,在一般场景下,我们不需要重新发明轮子,直接在成熟技术框架基础上开发使用即可。这也是CAS在很多互联网和企业应用中广泛使用的原因。当然,对于某些场景,如安全性因素、更特殊更高效的应用场景,在技术实力许可的情况下,通常都自己实现SSO。

简短地介绍完CAS之后,那我们就赶紧体验一下吧:

  1. 到cas源码工程https://github.com/Jasig/cas,点击releases到发布页
    q
    2.我们看到目前的最新版本是v4.1.0,我们看到这个版本就在9月中旬发布,说明CAS社区非常活跃。往下拉找到Downloads,下载cas-4.1.0.zip 源码包。
    q1
    3.解压到硬盘如e:\cas-4.1.0,cas源码提供的是maven工程,我们利用eclipse的maven import功能导入工程。笔者使用的eclipse版本是Luna。注意,cas提供了众多插件子工程,为了工作界面整洁,笔者只导入三个重要工程:父工程cas-server、核心包工程cas-server-core、运行web包工程cas-server-webapp。
    q2
    4.此时pom.xml可能提示有错误,按eclipse提示更正信息ignore即可。然后我们利用maven compile、package cas-server-webapp工程。正常情况下会生成cas.war 认证中心安装包,说明下载的源码没问题。
    q3
    5.找到WEB-INF\deployerConfigContext.xml,找到primaryAuthenticationHandler段落,修改登录用户名为admin,密码123123 做登录体验用。(CAS缺省使用的是配置文件方式管理用户名和密码,实际应用中使用最多的是利用数据库管理,CAS提供相应接口)
    q4
    6.找到WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml文件,将p:cookieSecure的值改为false。CAS缺省要求使用https协议,我们将此改为false,使其在http协议下也能工作。

7.copy如下代码到pom.xml文件的plugins段落中,配置tomcat7运行插件。

<plugin>  
  <groupId>org.apache.tomcat.maven</groupId>  
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <uriEncoding>UTF-8</uriEncoding>  
    <path>/</path>
    <port>80</port>
    <contextReloadable>false</contextReloadable>
  </configuration>  
</plugin>
  1. tomcat7:run 运行cas认证中心
    q5
  2. 在本机的host文件中配置一个域名,如www.cas.com,浏览器输入该网址,即可出现cas登录页:
    q6
    10.此时输入我们定义的用户名密码 admin/123123 系统显示成功登录了。我们可以输入网址http://www.cas.com/logout 让其登出,同时有意输入错误用户名密码看看页面的反应。
    q7
    上面我们体验的实际是在认证中心直接登录登出的情况,接下来我们体验应用系统利用cas进行的登录登出。

1.我们在host文件中再配置一个域名,www.ssoclient.com用于表示此应用系统登录网址。
2.建立一个java web maven工程,端口号设置为81,将CAS Client包配置到pom.xml中。(本例中整个工程采用spring mvc + spring,jsp为模板,同上,采用tomcat7 maven插件启动)

<dependency>
 <groupId>org.jasig.cas.client</groupId>
 <artifactId>cas-client-core</artifactId>
 <version>3.3.3</version>
</dependency>

3.在web.xml中添加如下配置:首先配置登出listener和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,即受限资源需要先经过此fiter.注意这里面要配置认证中心登录网址,以及标识此系统应用的服务名称。

<filter>
 <filter-name>CAS Authentication Filter</filter-name>     
 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
 <init-param>
  <param-name>casServerLoginUrl</param-name>
  <param-value>**http://www.cas.com/login**</param-value>
 </init-param>
 <init-param>
  <param-name>serverName</param-name>
  <param-value>**http://www.ssoclient.com:81**</param-value>
 </init-param>
</filter>
<filter-mapping>
 <filter-name>CAS Authentication Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

接下来配置验证票据ticket的filter,此作用类似于我们开发Nebula中的验证令牌token:

<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://www.cas.com**</param-value>
 </init-param>
 <init-param>
  <param-name>serverName</param-name>
  <param-value>**http://www.ssoclient.com:81**</param-value>
 </init-param>
</filter>

<filter-mapping>
 <filter-name>CAS Validation Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

最后我们配置一个Filter封装标准的HttpRequest,使得request.getRemoteUser()和request.getUserPrincipal()这两个方法可用。

<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>

在这样配置下,整个应用系统都是受限资源,我们定义一个一句话的首页JSP:

${user}, 你好啊! <a href="http://www.cas.com/logout">登出</a>

对应的controller也很简单:

@RequestMapping("/index.do")
public String showIndex(HttpServletRequest request, HttpServletResponse response) {
  Principal principal = request.getUserPrincipal();
  request.getSession().setAttribute("user", principal.getName());
  return "/index";  
}

准备就绪,启动运行。然后在浏览器打入网址www.ssoclient.com:81/index.do,由于整个系统资源受限需要登录,这时会立即跳入到认证中心进行登录(注意浏览器网址是不是带了一个service参数?跟我们自己开发SSO使用的returnURL有异曲同工之妙)。

输入正确的用户名密码后,又重新返回到系统应用,并显示登录后的系统首页。这个过程和我们自己开发Nebula时的系统体验是一样的。
q8
大家是不是还注意到在认证中心登录页用户名密码输入框下面还有一个“转向其他站点前提示我”checkbox选择框,选中这个意味着什么呢?下面我们来演示一下:

首先,将配置文件WEB-INF\spring-configuration\warnCookieGenerator.xml中的p:cookieSecure变量改成false,使其在http下起作用。

然后www.cas.com进入认证中心登录页,输入账户信息admin/123123 并选中“转向其他站点前提示我”进行登录。
q9
接着http://www.ssoclient.com:81/index.do 访问系统应用,这时和前面直接显示登录后首页不同,这里显示转向目标系统提示页。只要登录用户跳转到一个和现在不同的系统,即出现此提示页。点击“这里”即进入目标系统。
q10
至此,我们算是和CAS相遇了,后面我们将更深入CAS,使其能胜任实际应用。
q11
图片描述
本文出自慕课网,转载请注明出处,侵权必究。
点击查看更多内容
27人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 去赚学费 帮助中心 APP下载
官方微信

举报

0/150
提交
取消