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

  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/ljangle/p/10151148.html
Copyright © 2011-2022 走看看