博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cas5.3.2单点登录-集成客户端(六)
阅读量:3785 次
发布时间:2019-05-22

本文共 7710 字,大约阅读时间需要 25 分钟。

原文地址,转载请注明出处:      © 

之前在服务端整合了数据库,也整合了shiro,我们一直是在服务端玩,登录跳转到登录成功页面,没啥意思,今天我们来将服务端和 客户端整合,使不同的客户端使用cas登录。cas服务端还是基于之前的整合shiro版本。

环境概述

ip 域名 对应服务
127.0.0.1 server.cas.com CAS服务器
127.0.0.1 app1.cas.com CAS客户端1
127.0.0.1 app2.cas.com CAS客户端2

配置域名

/etc/hosts中增加如下配置:

127.0.0.1 server.cas.com
127.0.0.1 app1.cas.com
127.0.0.1 app2.cas.com

service配置(服务端)

客户端接入 CAS 首先需要在服务端进行注册,否则客户端访问将提示“未认证授权的服务”警告:

这里写图片描述
需求:对所有https和http请求的service进行允许认证,在resources/services下新建文件HTTPSandIMAPS-10000001.json,这个文件是我从cas源代码同路径下拷贝过来的。

{  "@class" : "org.apereo.cas.services.RegexRegisteredService",  "serviceId" : "^(https|imaps|http)://.*",  "name" : "测试客户端",  "id" : 10000001,  "description" : "这是一个测试客户端的服务,所有的https或者http访问都允许通过",  "evaluationOrder" : 10000}

注意:services目录中可包含多个 JSON 文件,其命名必须满足以下规则:${name}-${id}.json,id必须为json文件中内容id一致。

对其中属性的说明如下,更多详细内容见。
    ● @class:必须为org.apereo.cas.services.RegisteredService的实现类
    ● serviceId:对服务进行描述的表达式,可用于匹配一个或多个 URL 地址
    ● name: 服务名称
    ● id:全局唯一标志
    ● description:服务描述,会显示在默认登录页
    ● evaluationOrder:定义多个服务的执行顺序

修改application.properties

配置好service之后,根据,还需修改 application.properties 文件告知 CAS 服务端从本地加载服务定义文件

#注册客户端cas.serviceRegistry.initFromJson=truecas.serviceRegistry.watcherEnabled=truecas.serviceRegistry.schedule.repeatInterval=120000cas.serviceRegistry.schedule.startDelay=15000cas.serviceRegistry.managementType=DEFAULTcas.serviceRegistry.json.location=classpath:/servicescas.logout.followServiceRedirects=true

启动时,打印如下日志,说明服务注册成功

2018-07-31 18:49:38,611 WARN [org.apereo.cas.services.ServiceRegistryInitializer] - 
2018-07-31 18:49:38,611 WARN [org.apereo.cas.services.ServiceRegistryInitializer] -

客户端配置

导入证书

网上说必须保证客户端证书和服务端证书是同一个证书,不然就会报错,我因为是在同一台机器,所以就没有进行这一步操作。

sudo keytool -import -file /Users/wangsaichao/Desktop/tomcat.cer -alias tomcat -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/cacerts -storepass changeit

搭建客户端

在官方文档中提供了 CAS Java 客户端样例,即。下载项目导入idea

修改pom.xml

org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
8081
UTF-8
tomcat7
/

修改web.xml

这里给的例子是client1的,如果是client2只需要将 app1.cas.com:8081改为 app2.cas.com:8082

cas-app
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
CAS Single Sign Out Filter
org.jasig.cas.client.session.SingleSignOutFilter
casServerUrlPrefix
https://server.cas.com:8443/cas
CAS Single Sign Out Filter
/*
CAS Filter
org.jasig.cas.client.authentication.AuthenticationFilter
casServerLoginUrl
https://server.cas.com:8443/cas/login
serverName
http://app1.cas.com:8081
CAS Filter
/*
CAS Validation Filter
org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter
casServerUrlPrefix
https://server.cas.com:8443/cas
serverName
http://app1.cas.com:8081
CAS Validation Filter
/*
CAS HttpServletRequest Wrapper Filter
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
CAS HttpServletRequest Wrapper Filter
/*
CAS Assertion Thread Local Filter
org.jasig.cas.client.util.AssertionThreadLocalFilter
CAS Assertion Thread Local Filter
/*

修改index.jsp

为了看出效果,在两个客户端的index.jsp添加一些标签,和两个客户端互相跳转的路径,下面只给出客户端1的完整实例

<%@page contentType="text/html" %><%@page pageEncoding="UTF-8" %><%@ page import="java.util.Map" %><%@ page import="java.util.Iterator" %><%@ page import="java.util.List" %><%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %>    
CAS Example Java Web App

当前为客户端1

客户端1

客户端2

A sample web application that exercises the CAS protocol features via the Java CAS Client.


Authenticated User Id: <%= request.getRemoteUser() %>

<% if (request.getUserPrincipal() != null) { AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); final Map attributes = principal.getAttributes(); if (attributes != null) { Iterator attributeNames = attributes.keySet().iterator(); out.println("Attributes:"); if (attributeNames.hasNext()) { out.println("

"); out.println("
"); out.println("
"); for (; attributeNames.hasNext(); ) { out.println("
"); } out.println("
Attributes
Key Value
"); String attributeName = (String) attributeNames.next(); out.println(attributeName); out.println(" "); final Object attributeValue = attributes.get(attributeName); if (attributeValue instanceof List) { final List values = (List) attributeValue; out.println("Multi-valued attribute: " + values.size() + ""); out.println("
    "); for (Object value : values) { out.println("
  • " + value + "
  • "); } out.println("
"); } else { out.println(attributeValue); } out.println("
"); } else { out.print("No attributes are supplied by the CAS server.

"); } } else { out.println("
The attribute map is empty. Review your CAS filter configurations.
"); } } else { out.println("
The user principal is empty from the request object. Review the wrapper filter configuration.
"); }%>

测试

启动服务端和客户端,此时访问

会跳转至
输入用户信息,登录成功,返回
这里写图片描述

整合中出现的错误

这里首先把出现的错误罗列一下,个跟客户端整合的过程中,也是出现了很多的问题。

1.javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching cas.com found
原因:之前生成证书的时候,用的域名是server.cas.com 在开始使用cas 服务端的时候一直配置的域名是cas.com 其实应该带上server 所以,修改客户端中的cas.com 为 server.cas.com。记得修改/etc/hosts中的域名映射。

2.org.jasig.cas.client.validation.TicketValidationException: No principal was found in the response from the CAS server.

原因:通过debug,发现后台
Cas20ServiceTicketValidator.parseResponseFromServer(Cas20ServiceTicketValidator.java:98)也就是这行代码,解析的时候报错了.具体原因是解析html页面报错,返回的是登录页面,在server验证成功后,应该是templates/protocol/3.0/casServiceValidationSuccess.html页面负责生成与客户端交互的xml信息。但是返回的却是登录页面,问题出在哪里呢?网上很多都是说的中文乱码什么的,我这边不是这个原因。还记得我们上一篇 服务端整合shiro,没错 是shiro权限拦截了,因为我们设置了ShiroFilterFactoryBean 并且配置了/**为 user 就是被拦截了。这个其实是不应该配置 ShiroFilterFactoryBean的.
具体参考 :

你可能感兴趣的文章
编写类实现从后台向前台返回所要求的数据
查看>>
spring boot的学习(1.创建一个初始的spring boot项目)
查看>>
Python的入门学习
查看>>
⑤mpvue 小程序框架 :初始化项目 分析项目结构
查看>>
⑦mpvue Flyio实现前后台交互
查看>>
操作系统:Java模拟CPU调度算法(非抢占短进程优先、可抢占优先权调度、多级反馈队列调度)
查看>>
【前端】在页面中还原英雄联盟客户端?
查看>>
【前端】Vue 纯干货 基础知识分享!
查看>>
3.1servlet入门和MVC模型
查看>>
3.2servlet功能和会话技术
查看>>
泛型详解
查看>>
集合案例:斗地主
查看>>
软件测试进阶篇
查看>>
二叉搜索树的实现
查看>>
连续最大和
查看>>
不要二题目
查看>>
合法括号序列判断
查看>>
两种排序方法
查看>>
最小公倍数
查看>>
淘宝购物车测试用例
查看>>