CAS和Shiro在spring中集成

来源:互联网 发布:最新网络流行词2016 编辑:程序博客网 时间:2024/05/16 09:47

shiro 是权限管理框架,现在已经会利用它如何控制权限。为了能够为多个系统提供统一认证入口,又研究了单点登录框架 cas 。因为二者都会涉及到对 session 的管理,所以需要进行集成。

Shiro在1.2.0的时候提供了 对 cas的 集成 。 因此在项目中添加 shiro-cas 的依赖 
    <dependency> 
       <groupId>org.apache.shiro</groupId> 
      <artifactId>shiro-cas</artifactId> 
       <version>${shiro.version}</version> 
    </dependency>

Shiro  cas 集成后,cas client的配置更加简单了。原理就是将casFilter添加到到shiroFilter的filterChain中。   shiroFilter是在web.xml中定义的,前文已经讲过。

在Spring项目中集成Shiro和CAS

<?xmlversion="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"default-lazy-init="true"> <beanid="shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><propertyname="securityManager" ref="securityManager" /> <!--没有单点登录下的配置:没有权限或者失败后跳转的页面 --><!--<property name="loginUrl" value="/login/toLoginAction"/> --> <!--有单点登录的配置:登录 CAS 服务端地址,参数 service 为服务端的返回地址 --> <propertyname="loginUrl"value="http://localhost:18080/cas/login?service=http://localhost:8080/gxpt_web_qx_login/shiro-cas"/><!--<property name="successUrl" value="/page/index.jsp"/> --><propertyname="successUrl" value="/indexAction" /> <propertyname="filters"><map><!--添加casFilter到shiroFilter --><entrykey="casFilter" value-ref="casFilter"></entry></map></property>   <propertyname="filterChainDefinitions"><value>/shiro-cas= casFilter/styles/**= anon/**= user</value></property> <!--没有单点登录下的配置: --><!--<property name="filterChainDefinitions"><value>/styles/**= anon/login/loginAction= anon/login/logoutAction= logout/**= user</value></property>--></bean> <beanid="casFilter" class="org.apache.shiro.cas.CasFilter"><!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --><propertyname="failureUrl" value="/page/error.jsp" /></bean> <beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!--Single realm app. If you have multiple realms, use the 'realms' propertyinstead.--><!--没有单点登录下的配置: -->        <!--<property name="realm" ref="shiroDbRealm" /> --> <propertyname="realm" ref="casRealm" /><propertyname="subjectFactory" ref="casSubjectFactory" /> <propertyname="cacheManager" ref="shiroEhcacheManager" /></bean> <beanid="casRealm" class="web.qx.login.shiro.MyCasRealm"><propertyname="defaultRoles" value="ROLE_USER"/> <propertyname="casServerUrlPrefix"value="http://localhost:18080/cas" /><!--客户端的回调地址设置,必须和上面的shiro-cas过滤器拦截的地址一致 --><propertyname="casService"value="http://localhost:8080/gxpt_web_qx_login/shiro-cas"/></bean> <!--Define the realm you want to use to connect to your back-end securitydatasource:--><!--<beanid="shiroDbRealm"class="web.qx.login.shiro.ShiroDbRealm"><propertyname="loginService"ref="login-loginBean"></property></bean> --> <beanid="casSubjectFactory"class="org.apache.shiro.cas.CasSubjectFactory" /> <!--用户授权/认证信息Cache, 采用EhCache 缓存 --><beanid="shiroEhcacheManager"class="org.apache.shiro.cache.ehcache.EhCacheManager"><propertyname="cacheManagerConfigFile"value="classpath:config/ehcache-shiro.xml" /></bean>  <!--保证实现了Shiro内部lifecycle函数的bean执行 --><beanid="lifecycleBeanPostProcessor"class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  <!--AOP式方法级权限检查 --><!--Enable Shiro Annotations for Spring-configured beans. Only run after --><!--the lifecycleBeanProcessor has run: --><beanclass="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"depends-on="lifecycleBeanPostProcessor"><propertyname="proxyTargetClass" value="true" /></bean><beanclass="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><propertyname="securityManager" ref="securityManager" /></bean> </beans>

没有单点登录情况下的话,登录认证和授权认证默认在AuthorizingRealm的doGetAuthorizationInfo和doGetAuthenticationInfo中进行,所以我这里是通过shiroDbRealm(继承AuthorizingRealm的自定义类)覆写doGetAuthorizationInfo和doGetAuthenticationInfo,实现自定义登录认证和授权认证。

有单点登录情况下,登录认证是在 casserver 进行的,那么执行流程是这样的:用户从 cas server 登录成功后,跳到 cas client 的CasRealm执行默认的doGetAuthorizationInfo和doGetAuthenticationInfo,此时doGetAuthenticationInfo做的工作是把登录用户信息传递给 shiro ,保持默认即可,而对于授权的处理,可以通过MyCasRealm(继承CasRealm的自定义类)覆写doGetAuthorizationInfo进行自定义授权认证。

0 0
原创粉丝点击