zoukankan      html  css  js  c++  java
  • [原]CAS和Shiro在spring中集成

    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>

     

    Shirocas集成后,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' property
    instead.-->
    <!--没有单点登录下的配置: -->        
    <!--<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 security
    datasource:-->
    <!--
    <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: -->
    <bean
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
    depends-on="lifecycleBeanPostProcessor">
    <propertyname="proxyTargetClass" value="true" />
    </bean>
    <bean
    class="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进行自定义授权认证。

    作者:tcl_6666 发表于2014-3-28 19:56:32 原文链接
    阅读:1078 评论:14 查看评论
  • 相关阅读:
    社会影响力入门:打造有所作为的公司
    JSP中的include有哪些?有什么差别?
    关于程序猿怎样降低程序Bug的若干建议
    linux文件打开模式
    IntelliJ IDEA 问题总结之中的一个 —— jar包、assets、maven、git
    linux下改动内核參数进行Tcp性能调优 -- 高并发
    思科模拟器配置三层交换机局域网
    MFC调试小技巧
    JAVA基础编程50题(10-12题)具体解释
    加速度传感器的原理和应用-手机翻转、失重检测、运动检测、位置识别
  • 原文地址:https://www.cnblogs.com/mxcy/p/3982115.html
Copyright © 2011-2022 走看看