cas4.0 单点登录 之 cas-client

cas4.0 单点登录 之 https证书 已经做好了证书的准备工作,现在结合cas-server来配置单点登录;

一、安装cas服务端(cas-server)

cas服务端是一个war包,这里只做体验单点登录,cas-server下载点这里cas-server-webapp-4.0.0.war,将war包放tomcat下运行即可,运行cas-server的tomcat的要开启SSL支持,上面文章也有说明,server.xml需要如下配置:

<Connector port="8443" protocol="HTTP/1.1"maxThreads="150"  SSLEnabled="true"  scheme="https"  secure="true"clientAuth="false" sslProtocol="TLS" keystoreFile="d:/cas/keystore"  keystorePass="caspass"/>

cas-server的定制开发后面文章再讲。

二、cas客户端配置(cas-client)

1、web.xml方式配置

写了个简单客户端配置,源码cas_client_test_demo.zip

a) pom.xml

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.0.3.RELEASE</version></dependency><dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.4.1</version></dependency>
</dependencies>

b) web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><servlet><servlet-name>mvc-dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvc-dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- ****************** 单点登录开始 ********************--><!-- 用于实现单点登出功能  可选 --><listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!-- 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前 可选 --><filter><filter-name>CAS Single Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>https://cas.castest.com:8443/cas/</param-value></init-param></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><!--casServerLoginUrl:cas服务的登陆url --><param-name>casServerLoginUrl</param-name><param-value>https://cas.castest.com:8443/cas/login</param-value></init-param><init-param><!--serverName:本项目的ip+port --><param-name>serverName</param-name><param-value>http://www.zrk1000.com:8081</param-value></init-param><init-param><param-name>useSession</param-name><param-value>true</param-value></init-param><init-param><param-name>redirectAfterValidation</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/test</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://cas.castest.com:8443/cas/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://www.zrk1000.com:8081</param-value></init-param></filter><filter-mapping><filter-name>CAS Validation Filter</filter-name><!-- 对test做登录拦截--><url-pattern>/test</url-pattern></filter-mapping><!-- 该过滤器对HttpServletRequest请求包装, 可通过HttpServletRequest的getRemoteUser()方法获得登录用户的登录名,可选 --><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()。 这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息 --><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><!-- ****************** 单点登录结束 ********************--></web-app>

**注意:casServerLoginUrl和casServerUrlPrefix必须使用域名,且域名要和证书中的“名字与姓氏”完全相同,没有域名的可以配置本地hosts做映射
我的hosts配置是这样:

这里用的一台机器,两个域名均指向了本机,有域名的童鞋及土豪无视

c) spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><mvc:annotation-driven /><context:component-scan base-package="com.castest.*" /></beans>

d) 测试Controller

package com.castest.cas;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class IndexController {@RequestMapping("/test")@ResponseBodypublic String index(HttpServletRequest request, HttpServletResponse response) {String result = "execute test method</br>";result +=   "sessionId                  :   "+request.getSession().getId()  +"</br>";result +=   "request.getRemoteUser()    :   " + request.getRemoteUser()     +"</br>";result +=   "request.getUserPrincipal() :   " + request.getUserPrincipal()  +"</br>";return result;}@RequestMapping(value={"/","/index"})@ResponseBodypublic String error(HttpServletRequest request, HttpServletResponse response) {String result = "execute index method</br>";result +=   "sessionId                  :   "+request.getSession().getId()  +"</br>";result +=   "request.getRemoteUser()    :   " + request.getRemoteUser()     +"</br>";result +=   "request.getUserPrincipal() :   " + request.getUserPrincipal()  +"</br>";return result;}}

e) 测试结果

1、
请求:http://www.zrk1000.com:8081/cas_client/index

结果:web.xml中只对/test做登陆拦截,/index未跳转登陆正常

2、
请求:http://www.zrk1000.com:8081/cas_client/test
–> https://cas.castest.com:8443/cas/login?service=http%3A%2F%2Fwww.zrk1000.com%3A8081%2Fcas_client%2Ftest

被拦截重定向到了cas-server的默认登陆页面;server参数为原请求URL,认证成功后会重定向到此地址。
cas默认用户名为:casuser 默认密码:Mellon (cas-server的WEB-INF/deployerConfigContext.xml中)
–>http://www.zrk1000.com:8081/cas_client/test

结果:web.xml中只对/test做登陆拦截,/index不跳转;登陆正常,并且登陆成功后获取到了用户信息

2、基于spring boot配置

使用spring boot创建web项目没有web.xml,只能使用java代码的方式添加filter和listener,原理和web.xml一样,这里做了简单的配置,
github上源码:https://github.com/zrk1000/cas_client_boot,https://github.com/zrk1000/cas_client_boot_demo
或者源码压缩包:cas_client_boot_test_demo.zip
其中cas_client_boot_demo.war依赖cas_client_boot.jar。
使用spring boot的项目cas这样配置:

spring.mvc.view.prefix=/WEB-INF/page
spring.mvc.view.suffix=.jsp
server.session.cookie.domain=.castest.com
server.session.cookie.path=/
server.port=8081spring.cas.sign-out-filters=/*
spring.cas.auth-filters=/test
spring.cas.validate-filters=/test
spring.cas.request-wrapper-filters=/*
spring.cas.assertion-filters=/*spring.cas.cas-server-login-url=https://cas.castest.com:8443/cas/login
spring.cas.cas-server-url-prefix=https://cas.castest.com:8443/cas/
spring.cas.redirect-after-validation=true
spring.cas.use-session=true
spring.cas.server-name=http://www.zrk1000.com:8081

3 常见错误

1、javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching cas.castest.com found
原因:cas客户端使用的证书库中未找到相应的域名,也就是说客户端JDK导入的证书的域名与客户端访问的cas-server域名不同
解决:检查JDK证书库中证书域名是否和cas-server的域名相同,保持一致即可2、javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
原因:证书未导入等原因
解决:往jdk导入证书,使用IDE的小伙伴也要检查工具使用的jdk是否和你导入证书的jdk是同一个

2、cas4.0 单点登录 之 cas-client相关推荐

  1. 1、cas4.0 单点登录 之 https证书

    cas4.0 单点登录 之 https证书 公司项目使用分布式部署,使用单点登录可使各节点无状态,达到业务与用户认证解耦:cas-server与cas-client通讯安全完全基于https,需要ss ...

  2. Jeesite单点登录集成Cas另加自定义登录验证

    Jeesite单点登录集成Cas另加自定义登录验证 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台. Cas主要是用来解决多应用之 ...

  3. CAS4.1单点登录实现(包含原理配置实现及简易demo)

    CAS单点登录-简介 CAS 简介 CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠 ...

  4. 开源单点登录系统CAS入门

    单点登录系统CAS 目录 单点登录系统CAS 什么是单点登录? CAS 介绍 CAS 服务端部署 (1)复制war包到tomcat (2)运行tomcat (3)访问CAS登录页面 CAS服务端配置 ...

  5. 开源的单点登录系统CAS入门

    单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 当一 ...

  6. 单点登录之CAS原理和实现

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  7. 单点登录解决方案CAS

    #单点登录解决方案CAS ##一.单点登录 ​ 单点登录SSO,实现跨域登录.当用户第一次访问系统的时候,会被引导进入认证系统中进行登录:根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应 ...

  8. cas java单点登录_java单点登录系统CAS的简单使用

    http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...

  9. 单点登录之CAS原理和实现(转载)

    转载源:https://www.jianshu.com/p/613c615b7ef1 单点登录之CAS原理和实现 来源于作者刘欣的<码农翻身> + 自己的备注理解 这家集团公司财大气粗,竟 ...

最新文章

  1. Unity3D在iOS下为啥不能更新的资料收集
  2. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
  3. algorithm头文件下的常用函数
  4. comsol如何设置距离梯度_使用 COMSOL 软件求解经典 CFD 基准问题:顶盖驱动空腔...
  5. linux课堂笔记(5)
  6. 使用plsql创建oracle,在Oracle下使用PLSQL Developer创建简单的触发器
  7. js,jquery小知识点
  8. [tp3.2.1]让默认页面: 加载Home模块的Index控制器;而让admin.php默认去加载Admin模块的Adminc控制器....
  9. Funcom Seeking Volunteer Mods - Part 3
  10. IOS之未解问题--给UITableView提取UITableViewDataSource并封装瘦身失败
  11. 六大洲客户的特点,收藏备用~
  12. 擎天科技携手阿里云 助力政企客户一键管理碳排放
  13. P2627 [USACO11OPEN]Mowing the Lawn G (单调队列优化dp)
  14. ORA-12170:TNS:连接超时 详细解决方法
  15. HTML+CSS实现网易云音乐首页(手机版)
  16. linux pdf 加水印,将动态水印添加到PDF
  17. 第29期全国人工智能师资培训启动,百度500万AI人才培养计划续航
  18. C++中相对路径与绝对路径以及斜杠与反斜杠的区别
  19. Tomcat配置与调优
  20. java闭锁_Java闭锁_CountDownLatch

热门文章

  1. ios开发教程入门到精通
  2. 漏洞扫描工具 -- awvs13
  3. Java免流量浏览器_流量费白菜价:腾讯王卡福利再升级,QQ浏览器开启全网免流量功能...
  4. 八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具
  5. 微信自动加好友 模拟位置
  6. Linux第一章:2.VMTools安装教程
  7. input失去焦点验证格式_在文本框的onblur事件里写验证信息
  8. 上期所SimNow使用指南
  9. matlab初步学习1
  10. Java StringBuffer类的一些常用方法