Apache shiro(3)—cas + shiro配置说明

来源:互联网 发布:英国大学申请 知乎 编辑:程序博客网 时间:2024/06/06 04:01
    这篇博客我们还是继续讲如何使用,其他的我自己还需要一些时间来消化。这次因为项目的需要,将登录从shiro中抽出来交给cas来验证。Shiro,只负责权限的验证。shiro在1.2版本之后加入了对cas的支持。我们先从cas入手……

SSO的概念

    单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO就是一次登录,就可以访问多个互相信任的应用。而cas只是这种解决方案的一种实现。
    这么说吧:大家应该都去过游乐场,通常会卖通票。就是买一张票,就可以玩游乐场中的所有项目,而不用玩一项买一项的票。这就是单点登录最直白的理解了:“通票”。

原理:

    ok,下面就看一下,shiro+cas之后的认证过程。图里的票据指的是,第三步用户的验证信息通过验证后,cas服务器随机生成的一个唯一的身份标识。这个票据会被存储在浏览器的cookie中。注:这里只是直白的说法,后面会有博客详细这部分的过程。
    下图,表明的是一个web应用的登录过程,这时候用户访问第二个应用时可以直接拿浏览器中的cookie去cas认证,因为应用1已经证过了。因此用户访问第二个应用时就不需要重新登陆了。

Spring-shiro.xml的配置:

    上面大概的说了一下,cas的验证原理。下面就看看cas和shiro集成的配置。这个是基于前一篇博客的,如果不记得可以翻看前一篇博客。一下配置都已本地为例:
    首先,引入Jar包。shiro-cas-1.2.3.jar、cas-client-core-3.2.0.jar

    然后,在Spring - shiro.xml修改如下配置:

  • 第一:shiroSecurityFilter修改为: 

 <property name="loginUrl" value="http://localhost:18080/cas/login?service=http://localhost:8080/authority-web/shiro-cas"> </property>    <property name="successUrl" value="http://localhost:8080/authorityn-web/index.jsp"></property>          <property name="filters"><map> <!--添加cas的过滤器到shiro  --><entry key="casFilter"><bean class="org.apache.shiro.cas.CasFilter">                                        <!--配置验证错误时的失败页面 /main 为系统登录页面 --><property name="failureUrl" value="/message.jsp" /></bean></entry></map></property>     <!-- 过滤器链,请求url对应的过滤器 -->     <property name="filterChainDefinitions">           <value>                 /message.jsp=anon                 /logout=logout                 <!--shiro登出过滤器,清理shiro存储的缓存,用户信息等  -->                 /shiro-cas=casFilter  <!--cas的过滤器的拦截规则  -->                         <!--验证所有请求,如果shiro中不存在用户信息,则返回到loginUrl的登录页面  -->                                          /** =user                                   </value>     </property>
  • 第二:shiroRealm的配置中添加两个属性,分别为cas服务器的登录地址和cas客户端的入口即会被拦截的地址:
     <property name="casServerUrlPrefix" value="http://localhost:18080/cas"></property>     <property name="casService" value="http://localhost:8080/authorityn-web/shiro-cas"></property>
  • 第三:在securityManager的配置中加入属性:
<property name="subjectFactory" ref="casSubjectFactory"></property>
  • 第四:加入casSubjectFactory Bean的配置     
 <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory" />

    接着:Web.xml的配置,加入多点登出的配置,这里主要是从cas服务器上清除用户的登录信息:
<listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><filter><filter-name>singleSignOutFilter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping><filter-name>singleSignOutFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

    需要注意的是,这样单点退出Shiro中的用户信息是不会清除的,也就是说就算你点击退出了。各个应用还是能够正常访问。这里首先需要在web.xml中配置项目的默认访问地址和shiroSecurityFilter中的successUrl。否则可能会导致从退出到登录页面重新登录找不到页面的问题。那么退出的请求地址应该为:cas服务器注销地址+web应用退出地址作为参数。
http://localhst:18080/cas/logout?service=http://localhost:8080/itoo-authority-application-web/logout
    总结:cas和shiro的集成是将shiro的只能面对单个应用的登录抽离出来,交给cas去验证。前面,说过cas的验证实际上是一个“通票”的概念。
3 1