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

     
  • 相关阅读:
    带你剖析WebGis的世界奥秘----点和线的世界
    XML解析
    Java-工厂设计模式
    分享:软件包和文档
    启航,新开始
    docker容器网络通信原理分析(转)
    【好书分享】容器网络到kubernetes网络
    go语言接受者的选取
    go语言的unsafe包(转)
    protocol buffers生成go代码原理
  • 原文地址:https://www.cnblogs.com/liboware/p/12558689.html
Copyright © 2011-2022 走看看