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

原文地址:https://www.cnblogs.com/ljangle/p/10151148.html