zoukankan      html  css  js  c++  java
  • cas流程

    参考链接: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,估计哪里没有配置好,下次改

  • 相关阅读:
    wireshark tcp 协议分析
    Wireshark基本介绍和学习TCP三次握手
    利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能
    如何从零开始做代码评审
    Git版本控制:Github的使用之 多人协作及参与项目
    如何查看与分析IIS服务器日志?
    解决IIS无响应假死状态
    百度地图上的标注物太多导致界面卡顿的解决办法
    [转]搭建MySQL高可用负载均衡集群
    原型链相关
  • 原文地址:https://www.cnblogs.com/ljangle/p/10151148.html
Copyright © 2011-2022 走看看