[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]CAS 4.2.7版本,shiro+CAS集成的小问题

上一篇:[转帖]CAS单点退出不好使
下一篇:[备忘]CAS 4.2.7版本,修改CAS界面的默认语言

添加日期:2017/7/18 1:51:07 快速返回   返回列表 阅读2919次
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。



 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved