在做shiro cas单点登录遇到的问题,希望有的同学能够少踩点坑

 

1.java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.
    at org.apache.shiro.web.session.mgt.ServletContainerSessionManager.createSession(ServletContainerSessionManager.java:103)

 

在网上搜了很久发现都是shiro filter顺序问题,我这边改过之后还是一样,因为也是刚接手这个项目,再一个对shiro 和cas 也不太熟

就找大佬来看这个问题,发现是自定义的filter 注解问题如下图shiro+cas+spring boot遇到的问题

把有关spring 的注解去掉,就可以了,还要看看其他的filter 是不是也有这样的配置,如果有的话,可以配置在xml里,因为是这样的,上面那个错是SessionContext的类型不是httpSession ,我这个filter 加上spring的注解之后spring就会默认使用spring的session导致sesssion类型不一致而报错

 

2.java.lang.IllegalStateException: Principals returned from securityManager.login( token ) returned a null or empty value.  This value must be non null and populated with one or more elements.
    at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:274)

 

这个在网上搜半天没搜出来,这个原因是因为我这边的登录然后又登出,再请求能访问的资源时,那边发现subject已经为空了,

shiro+cas+spring boot遇到的问题

导致的原因是,casFilter 和 logoutFilter被spring管理了,虽然是spring boot项目,但是有很多xml 是因为这个项目是由spring mvc项目改过来的,但是没改彻底,所以很多东西还是在xml里配置的,

原配置如下:

shiro+cas+spring boot遇到的问题

shiro+cas+spring boot遇到的问题

如果是这样配置,spring 会管理在xml文件配置的filter ,那么当请求过来的时候,spring就会一层层走这些filter,导致走到logoutfilter的时候把subject清空了,所以我们配的这两个filter是要交给shirofilter管理的,

最后通过手动配置的方式来解决,让logoutfilter和casfilter以属性的方式存在于shirofilter中,而不以bean的方式,当然也可以以手动配置bean的方式,不过要另外做一些处理

手动配置shirofilter:

部分代码

shiro+cas+spring boot遇到的问题

部分代码

shiro+cas+spring boot遇到的问题

这样基本上就可以了,

还有种方式casFilter以bean的方式手工配置,需要加上:

shiro+cas+spring boot遇到的问题

我是推荐第一种方式

 

最后,自己是对shiro 和cas流程太不熟悉了,还有待提高,感谢大佬帮忙定位和解决的问题,遇见自己所陌生的领域,一时半会儿解决不掉,要懂得去寻求帮助,在此非常感谢LLL

 

 

 

 

 

 

 

相关文章: