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

      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到发布页

2.我们看到目前的最新版本是v4.1.0,我们看到这个版本就在9月中旬发布,说明CAS社区非常活跃。往下拉找到Downloads,下载cas-4.1.0.zip 源码包。

3.解压到硬盘如e:\cas-4.1.0,cas源码提供的是maven工程,我们利用eclipse的maven import功能导入工程。笔者使用的eclipse版本是Luna。注意,cas提供了众多插件子工程,为了工作界面整洁,笔者只导入三个重要工程:父工程cas-server、核心包工程cas-server-core、运行web包工程cas-server-webapp。

4.此时pom.xml可能提示有错误,按eclipse提示更正信息ignore即可。然后我们利用maven compile、package cas-server-webapp工程。正常情况下会生成cas.war 认证中心安装包,说明下载的源码没问题。 

5.找到WEB-INF\deployerConfigContext.xml,找到primaryAuthenticationHandler段落,修改登录用户名为admin,密码123123 做登录体验用。(CAS缺省使用的是配置文件方式管理用户名和密码,实际应用中使用最多的是利用数据库管理,CAS提供相应接口)

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>

tomcat7:run 运行cas认证中心

在本机的host文件中配置一个域名,如www.cas.com,浏览器输入该网址,即可出现cas登录页:

10.此时输入我们定义的用户名密码 admin/123123 系统显示成功登录了。我们可以输入网址http://www.cas.com/logout 让其登出,同时有意输入错误用户名密码看看页面的反应。

上面我们体验的实际是在认证中心直接登录登出的情况,接下来我们体验应用系统利用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时的系统体验是一样的。

大家是不是还注意到在认证中心登录页用户名密码输入框下面还有一个“转向其他站点前提示我”checkbox选择框,选中这个意味着什么呢?下面我们来演示一下:

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

然后www.cas.com进入认证中心登录页,输入账户信息admin/123123 并选中“转向其他站 点前提示我”进行登录。

接着http://www.ssoclient.com:81/index.do 访问系统应用,这时和前面直接显示登录后首页不同,这里显示转向目标系统提示页。只要登录用户跳转到一个和现在不同的系统,即出现此提示页。点击“这里”即进入目标系统。

至此,我们算是和CAS相遇了,后面我们将更深入CAS,使其能胜任实际应用。

作者: 手插口袋_ 
链接:http://www.imooc.com/article/3576
来源:慕课网
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值