参考链接:
https://blog.csdn.net/qq_34021712/article/details/81318649
https://blog.csdn.net/u010475041/article/details/78094251
大神超厉害,小菜鸟表示很崇拜
casServer:https://mmoayyed.unicon.net:8443/cas/login
casClient1:http://localhost:8080
casClient2:http://localhost:8082
协议流程:
1. 若业务系统未登录,302到https://mmoayyed.unicon.net:8443/cas/login?service=http%3A%2F%2Fapp1.cas.com%3A8081%2F
2. 用户提交用户名密码后,302到http://localhost:8080/?ticket=ST-14-pMSfaxuaq1tMmRccck4i9egxM4kDESKTOP-NEPM8G8
3. 认证中心验证ticket,并获取用户数据,https://mmoayyed.unicon.net:8443/cas/serviceValidate?service=p3/serviceValidate?service&ticket=ABC123
4. 成功获取用户数据
其实我们只关心两个阶段,其他都交给cas client去完成:
1. 请求的路径是否需要跳转到登录页
2. 回来的用户是否能访问被请求资源
客户端:
http://localhost:8080/
由于该连接没有service,所以重定向到登陆界面
<filter> <!--ApplicationFilterConfig[name=CAS Filter, filterClass=org.jasig.cas.client.authentication.AuthenticationFilter]--> <filter-name>CAS Filter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>https://mmoayyed.unicon.net:8443/cas/login</param-value> <!-- 使用的CAS-Server的登录地址,一定是到登录的action --> <!--https://cas.server.name:8443/cas/login?service=http%3A%2F%2Fapp1.cas.com%3A8081%2F--> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080/cas-sample-java-webapp</param-value> <!-- 当前Client系统的地址 --> </init-param> </filter>
此时登陆界面的地址路径为:
https://mmoayyed.unicon.net:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fcas-sample-java-webapp%2Findex.jsp
该图示重定向之后的界面和路径
cas server原本的登陆界面路径为:
https://mmoayyed.unicon.net:8443/cas/login
截图如下:
总结:二者的区别就是用户第一次访问app时,去cas认证中心的过程,CAS Filter拦截器会查看url有无service,参考cas验证流程
此时,输入用户名,密码验证通过
此时点击登陆后会进入cas的认证系统,默认的用户名密码,此处已经改为从数据库user表进行验证,主要方法是extends AbstractPreAndPostProcessingAuthenticationHandler,这个类用于有多个属性字段提交的情况
验证通过后,app所在界面进行跳转,显示用户登陆成功
此时浏览器输入 http://localhost:8082/cas-sample-java-webapp 访问客户端2,如下界面表示登陆成功。
查看cas server ;client1(8080端口);client2(8082)的JSESSIONID,为流程走代码作参考
可以知道:登陆成功后, ticket保存在cas server服务器端,除此之外下面的问题说明cas会加在客户端访问url后面返回
此时客户端会向cas server提交ticket进行验证,
<filter> <filter-name>CAS Validation Filter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://mmoayyed.unicon.net:8443/cas</param-value> <!-- 使用的CAS-Server的地址,一定是在浏览器输入该地址能正常打开CAS-Server的根地址 --> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080/cas-sample-java-webapp</param-value> <!-- 当前Client系统的地址 --> </init-param> </filter>
org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter
public class Cas30ProxyReceivingTicketValidationFilter extends Cas20ProxyReceivingTicketValidationFilter { public Cas30ProxyReceivingTicketValidationFilter() { super(Protocol.CAS3); this.defaultServiceTicketValidatorClass = Cas30ServiceTicketValidator.class; this.defaultProxyTicketValidatorClass = Cas30ProxyTicketValidator.class; }
}
public class Cas30ServiceTicketValidator extends Cas20ServiceTicketValidator { public Cas30ServiceTicketValidator(String casServerUrlPrefix) { super(casServerUrlPrefix); } @Override protected String getUrlSuffix() { return "p3/serviceValidate"; } }
serviceValidate这个接口传入ticket,service参数,验证有效性成功后,用户信息写入web应用的sessio里。至此,session会话建立结束。
下面是遇到的问题
NO1.在输入用户名,密码提交后出现以下界面如:此时app访问路径为 http://localhost:8080/?ticket=ST-14-pMSfaxuaq1tMmRccck4i9egxM4kDESKTOP-NEPM8G8
可以看到此时我们的用户已经通过验证,带着属于自己的凭据ticket返回----(这是没有修复之前的问题截图)
而用户是否登陆呢?
可以看到cas server的web界面已经进入到登陆成功的界面
在此基础上,点击退出之后,访问http://localhost:8081/ 则会进入https://cas.server.name:8443/cas/login?service=http%3A%2F%2Fapp1.cas.com%3A8081%2F 重新验证登陆
对于上面出显得问题,做出的调整是:将主机名省去,改为默认的localhost,则访问主机名的问题修复
No2.
这个问题的原因在于:搭建cas server服务器的时候,第一步是证书的配置,参考 https://blog.csdn.net/yelllowcong/article/details/78778452
而我的cas server则用的不是自己创建的证书,我选择的证书是官网下载下来的cas server压缩包解压后的cas-overlay-template-masteretccas hekeystore证书,https://www.cnblogs.com/ljangle/p/10038214.html
那么这个证书对于搭建客户端的关键是什么呢?
主要就是图片圈出的,而我理解不透彻,就对自己启动的cas server随便起了一个域名,虽然cas server启动了,但是在接入客户端的时候就栽了跟头。
那cas server自带的证书是什么样呢?
就是这个下图的内容,相应的,如果不想换证书,就把域名改一下,这样dns才可以在本地hosts文件找到对应的ip,否则就找不到。
到此并没有结束,由于我下载的cas server是6.0版本的,也就是只支持jdk11,而我的客户端项目是jdk1.8版本的,那么这个证书为什么会让两者有关联呢?
就是证书导入jdk1.8中;介于我是一个小菜鸟,还不知道怎么把证书加入到jdk11中,但是证书加入jdk1.8就是大把的教程,证书加入1.8底层原理不清楚,但是最终的目的就是让客户端在服务器验证登陆的时候,可以知道域名与ip之间的映射关系,注意客户端的jdk要选择证书嵌入的jdk,否则会出现unable to find valid certification path to requested target
至此,maven web 的客户端与cas server的服务器验证就完成了
欢迎指教,只懂java se的仙女表示我尽力了
有一个问题是我的登陆成功界面没有;jsessionid=3EFAC76F253826DB83F73C8EC7432D10,估计哪里没有配置好,下次改