CAS 4.2.7版本,shiro+CAS集成小问题
大概参考这个吧: http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool&utm_medium=referral
(1)客户端工程的Maven里添加shiro-cas和cas-client-core的jar包。
(2)写个类继承org.apache.shiro.cas.CasRealm.CasRealm类
(3)spring配置文件里添加realm,casFilter,shiroFilter等的定义,
<bean id="casRealm" class="package.for.your.MyCasRealm"> ... <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/>
<!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean>
casServerUrlPrefix,这个值举例:http://localhost:28080/cas casService,这个值举例:http://www.bbb.com:48080/xxxxx/shiro-cas xxxxx是你的工程名,shiro-cas是一个随便写的路径,但是,要把它配置在shiroFilter里
<bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <property name="failureUrl" value="/casFailure.jsp"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter">
<property name="redirectUrl" value="${shiro.logoutUrl}"/> </bean>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="filters"> <util:map> <entry key="casFilter" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> </util:map> </property> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /shiro-cas = casFilter /logout = logout /** = user </value> </property> </bean>
casFilter的failureUrl属性 是指客户端验证ticket时,如果失败了,显示的页面的url,随便搞一个即可 logoutFilter的redirectUrl 是指客户端退出时跳转到的URL, 这个值举例为:http://localhost:28080/cas/logout?service=http://www.bbb.com:48080/xxxxx/shiro-cas 也就是跳转到CAS执行退出。不带service参数也行的。 带service参数的话,可以在退出后再跳转回来,但这个跳转默认是没开的,退出后是显示一个退出成功页面的。 shiroFilter的loginUrl 是指shiro发现用户没登录时,跳转到的URL, 举例如:http://localhost:28080/cas/login?service=http://www.bbb.com:48080/xxxxx/shiro-cas 会跳到cas的登录页面,登录成功后会跳到service指定的URL,参数里带着ticket。 filterChainDefinitions里的shiro-cas 映射为casFilter,然后cas登录成功后,带着ticket访问此url。 此url的casFilter,会拿着ticket去cas 服务器验证一下ticket是否可用。 这个shiro-cas是随便写的,改成别的话,上面的几个地方都要改。 其他的url映射和原来一样写即可。 cas说白了只是一种登录方式,和普通的表单登录(也就是authc)什么的没啥区别,登录完了会保存用户到session里。 所以该检查用户,检查角色的,都和原来一样。 ----------- 总之,这几个参数很重要,写不好就容易不停的跳转。 还有一种情况是cas登录成功了,但是跳转回客户端的某个URL时,没有权限,也就是认证失败, 会跳回到cas的login地址,但是cas是登录成功的,导致又跳回客户端,如此反复,导致死循环,chrome会报重定向次数过多。
(4)单点退出 单点退出需要依靠CAS的Filter来实现,在web.xml中添加
<filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>http://localhost:28080/cas/</param-value> </init-param> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener>
位置放在characterEncodingFilter之后,切记,否则会乱码的,因为SingleSignOutFilter取了request参数(request只能取一次,之后Filter里取的都是缓存的结果了)
如果你的SessionManager使用了DefaultWebSessionManager,也就是shiro自己管理Session, 那么单点退出会有问题。
单点退出的Servlet只处理了容器默认的session,shiro管理的session没管。
解决办法: (1)不用DefaultWebSessionManager,改成ServletContainerSessionManager,由容器管理session,自然就没问题了。 (2)坚持用DefaultWebSessionManager,那么就得自己改 org.jasig.cas.client.session.SingleSignOutFilter、 SingleSignOutHandler和SessionMappingStorage。
|