关闭

spring+shiro+jasig-cas+cxf 单点登录多点注销简单统一权限管理平台

897人阅读 评论(0) 收藏 举报
分类:

本文简单实现在spring框架下对apache shiro与jasig-cas 整合 实现单点登录多点注销统一权限管理平台,功能简单,主要大致讲讲入门配置。

一、环境:

  1、后台框架:spring3.2+struts2+hibernate4+apache-shiro1.2.1+jasig-cas3.4.1(具体相关依赖包请自行上官网下载);

  2、数据库:mysql5.x;

  3、servlet容器:tomcat6;


二、首先CAS服务器搭建

  1、官网下载cassever包,解压后将modules文件夹里的 cas-server-webapp-*.war  复制到 tomcat  webapps文件夹下;

  2、启动tomcat,输入相同的用户名和密码登录,将提示登录成功,这个cas默认的认证方式,刷新页面将回到登录页面;

  3、修改cas默认的认证方式: 做web开发,我们一般用数据库用户密码方式认证:

        a、修改web-inf下的deployerConfigContext.xml,注释掉默认的验证:

[html] view plaincopy
  1. <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />  
  2.                   
       b、添加获取认证信息的数据源:
[html] view plaincopy
  1. <bean id="casdataSource"  name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  2.         <property name="driverClassName" >  
  3.            <value>com.mysql.jdbc.Driver</value>  
  4.         </property>  
  5.         <property name="url">  
  6.            <value><![CDATA[jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8]]></value>  
  7.         </property>  
  8.         <property name="username" >  
  9.            <value>root</value>  
  10.         </property>  
  11.         <property name="password" >  
  12.            <value>root</value>  
  13.         </property>  
  14.     </bean>  
      c、在注释掉的默认验证后增加bean,以下表示从该数据源的t_user表中获取认证信息,需要使用加密的自行google
[html] view plaincopy
  1. <bean id="QueryDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
  2.                   <property name="dataSource" ref="casdataSource"></property>  
  3.                   <property name="sql" value="select USER_PWD from T_USER where USER_NAME=?"></property>  
  4.                 </bean>  
     4、cas协议,cas默认使用https协议,如果对安全要求不高,可使用http协议,我这里使用http协议

          a、修改deployerConfigContext.xml,

[html] view plaincopy
  1. <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"  
  2.                     p:httpClient-ref="httpClient" p:requireSecure="false"/><!-- require 属性为true 开启ssl -->  
           b、修改spring-configuration下的ticketGrantingTicketCookieGenerator.xml
[html] view plaincopy
  1. <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"  
  2.         p:cookieSecure="false"  
  3.         p:cookieMaxAge="-1"  
  4.         p:cookieName="CASTGC"  
  5.         p:cookiePath="/cas" />  
  6.         <!-- 使用http协议:  cookieSecure 为false -->  
  7. </beans>  

以上,完成使用jdb数据源http协议的简单cas server端配置,可以启动tomcat 输入地址查看,这时候认证将需要与数据库里的用户信息匹配还能认证成功!



     三、客户端client1配置

        client1 相关其他配置就不详讲了,主要讲述spring与shiro与cas的相关配置

       1、首先引入客户端所需jar包:spring相关jar包,shiro jar包,cas client jar包(下载cas client modules 下会有cas-client-core-.jar)

       2、web.xml 相关配置

           加载相关配置文件与监听

[html] view plaincopy
  1. <context-param>  
  2.         <description>相关配置文件加载</description>  
  3.         <param-name>contextConfigLocation</param-name>  
  4.         <param-value>classpath:spring*.xml</param-value>  
  5.     </context-param>  
  6.   
  7.   
  8.  <!-- 相关监听加载 -->  
  9.     <listener>  
  10.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  11.     </listener>  
  12.     <listener>  
  13.         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
  14.     </listener>  
  15.     <listener>  
  16.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  17.     </listener>  
  18.     <listener>  
  19.         <listener-class>com.areo.kongtan.listener.SessionListenerHandler</listener-class>  
  20.     </listener>  
        shiro filter配置,shiro在1.2后开始支持的cas

        

[html] view plaincopy
  1. <filter>  
  2.     <description>  
  3.     shrio权限过滤,DelegatingFilterProxy 作用是自动到 spring 容器查找名字为 shiroFilter(filter-name)的 bean并把所有 Filter 的操作委托给它  
  4.       </description>  
  5.     <filter-name>shiroFilter</filter-name>  
  6.     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  7.     <init-param>  
  8.         <param-name>targetFilterLifecycle</param-name>  
  9.         <param-value>true</param-value>  
  10.     </init-param>  
  11. </filter>  
  12. <filter-mapping>  
  13.     <filter-name>shiroFilter</filter-name>  
  14.     <url-pattern>/*</url-pattern>  
  15. </filter-mapping>  

    以上完成client端的web配置 下一篇讲client端spring整合相关配置


 spring相关主要配置文件

  1、位于classpath路径下的spring-shirocas-web.xml 

    

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- 缓存管理器 ehcache 的配置 -->  
  2.     <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
  3.         <property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />  
  4.     </bean>  

ehcache.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ehcache name="shirocache">  
  3.   
  4.     <diskStore path="java.io.tmpdir"/>  
  5.   
  6.     <!-- 登录记录缓存 锁定10分钟 -->  
  7.     <cache name="passwordRetryCache"  
  8.            maxEntriesLocalHeap="2000"  
  9.            eternal="false"  
  10.            timeToIdleSeconds="3600"  
  11.            timeToLiveSeconds="0"  
  12.            overflowToDisk="false"  
  13.            statistics="true">  
  14.     </cache>  
  15.   
  16.     <cache name="authorizationCache"  
  17.            maxEntriesLocalHeap="2000"  
  18.            eternal="false"  
  19.            timeToIdleSeconds="3600"  
  20.            timeToLiveSeconds="0"  
  21.            overflowToDisk="false"  
  22.            statistics="true">  
  23.     </cache>  
  24.   
  25.     <cache name="authenticationCache"  
  26.            maxEntriesLocalHeap="2000"  
  27.            eternal="false"  
  28.            timeToIdleSeconds="3600"  
  29.            timeToLiveSeconds="0"  
  30.            overflowToDisk="false"  
  31.            statistics="true">  
  32.     </cache>  
  33.   
  34.     <cache name="shiro-activeSessionCache"  
  35.            maxEntriesLocalHeap="2000"  
  36.            eternal="false"  
  37.            timeToIdleSeconds="3600"  
  38.            timeToLiveSeconds="0"  
  39.            overflowToDisk="false"  
  40.            statistics="true">  
  41.     </cache>  
  42.   
  43. </ehcache>  
  自定义casRealm
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. bean id="casRealm" class="com.test.client1.shiro.MyCasRealm">  
  2.         <property name="cachingEnabled" value="true" />  
  3.         <property name="authenticationCachingEnabled" value="true" />  
  4.         <property name="authenticationCacheName" value="authenticationCache" />  
  5.         <property name="authorizationCachingEnabled" value="true" />  
  6.         <property name="authorizationCacheName" value="authorizationCache" />  
  7.         <property name="casServerUrlPrefix" value="http://localhost:8080/cas" />  <!--该地址为cas server地址  
  8.         <property name="casService" value="http://localhost:8080/client1/shiro-cas" /> <!-- 该地址为client1 的访问地址+ 下面配置的cas  filter -->    
  9.     </bean>  

MyCasRelam.java 内容

    

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import org.apache.shiro.authz.AuthorizationInfo;  
  2. import org.apache.shiro.cas.CasRealm;  
  3. import org.apache.shiro.subject.PrincipalCollection;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.SessionFactory;  
  6.   
  7.   
  8. public class MyCasRealm extends CasRealm{  
  9.       
  10.       
  11.       
  12.     @Override  
  13.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  14.         String username = (String)principals.getPrimaryPrincipal();  //从这里可以从cas server获得认证通过的用户名,得到后我们可以根据用户名进行具体的授权  
  15.        //也可以从  Subject subject = SecurityUtils.getSubject();  
  16. <span style="white-space:pre">        </span>//return (String)subject.getPrincipals().asList().get(0); 中取得,因为已经整合后 cas 交给了 shiro-cas  
  17.     /*  PermissionService service = (PermissionService)SpringContextUtil.getBean("PermissionService");  
  18.         List<String> codes = service.findPermissionCodeByUsername(username); 
  19.         if(codes != null && codes.size() > 0){ 
  20.              SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); 
  21.                  for (String str : codes) 
  22.                     { 
  23.                         authorizationInfo.addStringPermission(str); 
  24. //                       info.addRole(role); 
  25.                     } 
  26.                 return authorizationInfo; 
  27.         }*/  
  28.        return  null;  
  29.     }  
  30. }  

shirocas-web.xml配置 重要

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- Shiro的Web过滤器 -->  
  2.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  3.         <property name="securityManager" ref="securityManager" />  
  4.         <property name="loginUrl"  
  5.             value="http://localhost:8080/cas/login?service=http://localhost:8080/client1/shiro-cas" /> <!--访问client1 时,如果未通过cas认证将会跳转到认证中心,通过得跳转到下面配置的successUrl 里的地址 -->  
  6.         <property name="successUrl" value="http://localhost:8080/client1/index.jsp" />  
  7.         <property name="filters">  
  8.             <util:map>  
  9.                 <entry key="authc" value-ref="formAuthenticationFilter" />  
  10.                 <entry key="cas" value-ref="casFilter" />  
  11.             </util:map>  
  12.         </property>  
  13.         <property name="filterChainDefinitions">  
  14.             <value>  
  15.                 /casFailure.jsp = anon  
  16.                 /shiro-cas* = cas  
  17.                 /images/** = anon  
  18.                 /css/** = anon  
  19.                 /js/** = anon  
  20.                 /static/** = anon  
  21.                 /logout = logout  
  22.                 /** = authc  
  23.             </value>  
  24.         </property>  
  25.     </bean>  

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- 会话ID生成器 -->  
  2. <bean id="sessionIdGenerator"  
  3.     class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />  
  4.   
  5. <!-- 会话Cookie模板 -->  
  6. <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
  7.     <constructor-arg value="sid" />  
  8.     <property name="httpOnly" value="true" />  
  9.     <property name="maxAge" value="-1" />  
  10. </bean>  
  11.   
  12. <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
  13.     <constructor-arg value="rememberMe" />  
  14.     <property name="httpOnly" value="true" />  
  15.     <property name="maxAge" value="2592000" /><!-- 30天 -->  
  16. </bean>  
  17.   
  18. <!-- rememberMe管理器  如需要记住功能 可删掉相关配置<span style="white-space:pre">    
  19. lt;/span>    <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">  
  20.     <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)-->  
  21.     <property name="cipherKey"  
  22.         value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}" />  
  23.     <property name="cookie" ref="rememberMeCookie" />  
  24. </bean>  
  25.   
  26. <!-- 会话DAO -->  
  27. <bean id="sessionDAO"  
  28.     class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">  
  29.     <property name="activeSessionsCacheName" value="shiro-activeSessionCache" />  
  30.     <property name="sessionIdGenerator" ref="sessionIdGenerator" />  
  31. </bean>  
  32.   
  33. <!-- 会话验证调度器 -->  
  34. <bean id="sessionValidationScheduler"  
  35.     class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">  
  36.     <property name="sessionValidationInterval" value="1800000" />  
  37.     <property name="sessionManager" ref="sessionManager" />  
  38. </bean>  
  39.   
  40. <!-- 会话管理器 -->  
  41. <bean id="sessionManager"  
  42.     class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  
  43.     <property name="globalSessionTimeout" value="1800000" />  
  44.     <property name="deleteInvalidSessions" value="true" />  
  45.     <property name="sessionValidationSchedulerEnabled" value="true" />  
  46.     <property name="sessionValidationScheduler" ref="sessionValidationScheduler" />  
  47.     <property name="sessionDAO" ref="sessionDAO" />  
  48.     <property name="sessionIdCookieEnabled" value="true" />  
  49.     <property name="sessionIdCookie" ref="sessionIdCookie" />  
  50. </bean>  
  51.   
  52. <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory" />  
  53. <!-- 安全管理器 -->  
  54. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  55.     <property name="realm" ref="casRealm" />  
  56.     <property name="sessionManager" ref="sessionManager" />  
  57.     <property name="cacheManager" ref="cacheManager" />  
  58.     <property name="rememberMeManager" ref="rememberMeManager" />  
  59.     <property name="subjectFactory" ref="casSubjectFactory" />  
  60. </bean>  
  61.   
  62. <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) -->  
  63. <bean  
  64.     class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
  65.     <property name="staticMethod"  
  66.         value="org.apache.shiro.SecurityUtils.setSecurityManager" />  
  67.     <property name="arguments" ref="securityManager" />  
  68. </bean>  
  69.   
  70. <bean id="casFilter" class="org.apache.shiro.cas.CasFilter">  
  71.     <property name="failureUrl" value="/casFailure.jsp" />  
  72. </bean>  
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <pre name="code" class="html"><bean id="casFilter" class="org.apache.shiro.cas.CasFilter">  
  2.         <property name="failureUrl" value="/casFailure.jsp" />  
  3.     </bean>  
  4.   
  5.     <bean id="formAuthenticationFilter"  
  6.         class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter" />  
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- Shiro生命周期处理器-->  
  2.     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  




以上基本完成 在spring下 shiro与cas的整合 

启动tomcat,访问 client1 将会跳转到cas认证中心,认证通过将自动跳转的 client1的首页! 多个client 与上类似!


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:263083次
    • 积分:3314
    • 等级:
    • 排名:第10198名
    • 原创:24篇
    • 转载:313篇
    • 译文:1篇
    • 评论:20条
    最新评论