SpringBoot+Cas+Shiro+JWT问题总结

本文总结了在SpringBoot应用中整合CAS、Shiro和JWT实现单点登录时遇到的问题。讨论了CasRealm验证方法不识别JwtToken的解决方案,以及Cas跨顶级域名单点登出失效的处理。作者通过在SpringBoot中添加Filter,并配置多个Cas服务器的hosts,成功解决了登出问题。最后,提到了Cas服务器使用的版本和配置,以及使用Redis存储ticket的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#单点登录 #cas 跨域名 单点登出       #cas使用教程

Springboot后台使用  pac4j 4.0

配置Cas+Shiro之后碰见CasRealm里的验证方法不识别 JwtToken

 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)

在CasRealm里重写supports

    /**
     * 重点:注意,这里必须判断,cas登录时,token类型为AuthenticationToken
     *
     * @param token
     * @return
     */
    @Override
    public boolean supports(AuthenticationToken token) {
        if (token instanceof JwtToken) {
            return token instanceof JwtToken;
        }
        return token instanceof AuthenticationToken;
    }

Cas跨顶级域名单点登出失效问题

Client1 www.aaa.com

Client2 www.bbb.com

登出 Client1 ,  Client2 刷新后不会登出。

网上找了一大堆资料,全部无用,暂时只能是用Nginx转发或二级域名去配置,等找到更好的解决方法再更新。

2021年12月21日09:47:46 更新

SpringBoot添加Filter

    @Bean
    public ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> singleSignOutHttpSessionListener() {
        ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> listener = new ServletListenerRegistrationBean<SingleSignOutHttpSessionListener>();
        listener.setEnabled(true);
        listener.setListener(new SingleSignOutHttpSessionListener());
        listener.setOrder(1);
        return listener;
    }

    /**
     * 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前
     *
     * @return
     */
    @Bean
    public FilterRegistrationBean singleSignOutFilter() {
        FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
        filterRegistration.setFilter(new SingleSignOutFilter());
        filterRegistration.setEnabled(true);
        filterRegistration.addUrlPatterns("/*");
        filterRegistration.addInitParameter("casServerUrlPrefix", casServerUrl);//Cas的地址
        filterRegistration.addInitParameter("serverName", projectUrl);//当前项目的地址
        filterRegistration.setOrder(1);
        return filterRegistration;
    }

然后直接调用 casServerUrl + "/logout"

他会向通知每个客户端,可以启动两个项目hosts配置

127.0.0.1 www.cas1.com

127.0.0.1 www.cas2.com

并在SingleSignOutHttpSessionListener()的 sessionDestroyed方法下打断点

在网址输入 casServerUrl + "/logout" 回车,查看两个项目是否都进入 sessionDestroyed 方法。

如无法进入请检查网络。

我的环境:

Cas-Overlay-template 5.3.14  使用了redis存储ticket

Cas Server引入

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-redis-ticket-registry</artifactId>
            <version>${cas.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-redis-service-registry</artifactId>
            <version>${cas.version}</version>
        </dependency>

application.properties 添加设置

#是否移除子系统的票据
cas.logout.removeDescendantTickets=true
cas.slo.asynchronous=true
#Redis
cas.ticket.registry.redis.host=192.168.1.100
cas.ticket.registry.redis.database=0
cas.ticket.registry.redis.port=6379
cas.ticket.registry.redis.password=
cas.ticket.registry.redis.timeout=20000
cas.ticket.registry.redis.useSsl=false
cas.ticket.registry.redis.usePool=false
cas.ticket.registry.redis.pool.max-active=20
cas.ticket.registry.redis.pool.maxIdle=8
cas.ticket.registry.redis.pool.minIdle=0
cas.ticket.registry.redis.pool.maxActive=8
cas.ticket.registry.redis.pool.maxWait=-1

 亲测有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值