1.cas配置http请求(服务端)

  1) 解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.war复制到tomcat的webapps下,启动tomcat,访问http://localhost:8080/cas/login 就可以看到登录界面了:

  2) cas默认采用https进行验证,如果使用http进行验证,需要修改服务端的配置文件

    a.修改cas\WEB-INF\deployerConfigContext.xml文件

      <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"/>增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用,加上去之后如下:

      <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"  p:httpClient-ref="httpClient"  p:requireSecure="false"/>

    b.修改cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml文件

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"  p:cookieSecure="false" p:cookieMaxAge="-1" p:cookieName="CASTGC" :cookiePath="/cas" />

    c.修改服务端cas-servlet.xml配置

      <bean id="logoutController" class="org.jasig.cas.web.LogoutController" ... .../>增加属性 p:followServiceRedirects="true",使单点退出后能调到制定的页面,退出链接为:http://localhost:8080/cas/logout?service=http://localhost:8080/Casclient/index.jsp

    d.修改配置文件deployerConfigContext.xml,使通过数据库进行验证,密码经过md5进行加密,需要cas-server-support-jdbc-3.4.4.jar和mysql-connector-java-5.1.37.jar

      <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

        <property   name="dataSource" ref="dataSource"></property>

        <property name="sql" value="select password from cas_user where username=?"></property>

        <property name="passwordEncoder" ref="md5PasswordEncoder"></property>

      </bean>

      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

       <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>

      <property name="url"><value>jdbc:mysql://localhost:3306/test</value></property>

      <property name="username"><value>root</value></property>

      <property name="password"><value>root</value></property>

      </bean>

      <bean id="md5PasswordEncoder"   class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">

       <constructor-arg index="0"><value>MD5</value></constructor-arg>

      </bean>

  3)为了让服务端返回更多的用户信息,需要进行一些配置

    a.修改deployerConfigContext.xml文件

      注释掉<bean id="attributeRepository"class="org.jasig.services.persondir.support.StubPersonAttributeDao">...</bean>,添加

      <bean class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository">
            <!-- 指定使用的数据源,此处dataSource是已配置好的数据源 -->
            <constructor-arg index="0" ref="dataSource"/>
            <!-- 从数据库中查询信息的SQL语句,通常只需要修改表名即可 -->
           <constructor-arg index="1" value="select id from cas_user where {0}"/>
             <property name="queryAttributeMapping">
                  <map>
               <!-- 上述查询的参数,将userName替换为表中表示用户名的字段名称 -->
                  <entry key="username" value="userName"/>
              </map>
          </property>
          <property name="resultAttributeMapping">
              <map>
              <!-- 需要返回给Web应用的其它信息,多个信息时可继续增加entry节点-->
              <!--key值为数据表中的字段名称,value值为Client端取值时的名称标识-->
                  <entry key="id" value="id"/>
              </map>
          </property>
     </bean>

    同时在<bean  id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
                <property name="registeredServices">
                    <list>
                        <bean class="org.jasig.cas.services.RegisteredServiceImpl">

            添加<!-- 客户端需要使用的对象的属性名称 -->
                             <property name="allowedAttributes">
                                   <list>
                                         <value>id</value>
                                           <value>username</value>
                                   </list>
                            </property>

    服务器端可以通过:Map<String, Object> accountAttrs=ticketGrantingTicket.getAuthentication().getPrincipal().getAttributes();
                  int userid=Integer.parseInt(accountAttrs.get("id").toString());获取

    客户端可以通过:<h1>当前用户id:<%=((AttributePrincipal)request.getUserPrincipal()).getAttributes().get("id") %></h1>获取

  4)为了让给客户端提供修改服务端账户的service服务,使用rmi进行远程调用,在服务端进行如下设置:

    在cas-servlet.xml中添加 

      <bean id="accountServiceImpl" class="org.jasig.cas.web.account.AccountServiceImpl">
        <property name="centralAuthenticationService" ref="centralAuthenticationService"/>
         </bean>
          <bean id="accountService" class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="serviceName">
          <value>AccountService</value>
        </property>
           <property name="service">
              <ref bean="accountServiceImpl"/>
           </property>
           <property name="serviceInterface">
              <value>org.jasig.cas.web.account.IAccountService</value>
           </property>
           <property name="registryPort">
              <value>1200</value>
           </property>
        </bean>

  5)客户端配置

    1)配置单点登录,在web.xml中添加   
       <!--用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
       <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
       </listener> 
       <!--该过滤器用于实现单点登出功能,可选配置。 -->
       <filter>
          <filter-name>CASSingle Sign Out Filter</filter-name>
          <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
       </filter>
       <filter-mapping>
        <filter-name>CASSingle Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
       </filter-mapping> 
       <!--该过滤器负责用户的认证工作,必须启用它 -->
       <filter>
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
          <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>http://localhost:8080/cas/login</param-value>
            <!--这里的server是服务端的IP-->

          </init-param>
          <init-param>
            <param-name>serverName</param-name>
            <param-value>http://app1.life:8081</param-value>
          </init-param>
      </filter>
      <filter-mapping>
        <filter-name>CASFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping> 
      <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
      <filter>
        <filter-name>CASValidation Filter</filter-name>
        <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
          <param-name>casServerUrlPrefix</param-name>
          <param-value>http://localhost:8080/cas</param-value>
        </init-param>
        <init-param>
          <param-name>serverName</param-name>
          <param-value>http://app1.life:8081</param-value>
        </init-param>
    </filter>
    <filter-mapping>
      <filter-name>CASValidation Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping> 
    <!-- 该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
    <filter>
      <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
      <filter-class> org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping> 
    <!--该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。比如AssertionHolder.getAssertion().getPrincipal().getName()。-->
    <filter>
      <filter-name>CASAssertion Thread Local Filter</filter-name>
      <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>CASAssertion Thread Local Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping> 
    <!--======================== 单点登录结束 ======================== --> 

    2)为了能在在客户端修改服务端的账户数据,需要获取到服务的账户管理service,在spring-servlet.xml中添加

      <bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
            <property name="serviceUrl"><value>rmi://localhost:1200/AccountService</value></property>
            <property name="serviceInterface"><value>org.jasig.cas.web.account.IAccountService</value></property>
         </bean>      

项目使用方法和下载地址:

1.下载地址:http://pan.baidu.com/s/1jG96mOm

2.使用方法:1.使用tomcat部署启动cas(cas服务器)

      2.使用jetty,clean install cas_client编译并安装cas_client

      3.使用jetty,分别编译并部署启动sso和sso1,来模拟不同的两个项目

      4.访问http://app1.life:8081/hello.jsp和http://app2.life:8082/hello.jsp来验证单点登录

      默认用户有:用户名 lisi ,密码  lisi,拥有两个项目的权限

            用户名tom,密码123,拥有app2.life:8082的权限

            用户名bb,密码lisi,拥有app1.life:8081的权限

cas的http配置和rmi远程调用的更多相关文章

  1. JAVAEE——BOS物流项目08:配置代理对象远程调用crm服务、查看定区中包含的分区、查看定区关联的客户

    1 学习计划 1.定区关联客户 n 完善CRM服务中的客户查询方法 n 在BOS项目中配置代理对象远程调用crm服务 n 调整定区关联客户页面 n 实现定区关联客户 2.查看定区中包含的分区 n 页面 ...

  2. 在maven项目中 配置代理对象远程调用crm

    1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...

  3. java RMI 远程调用

    1.背景 在学习代理模式的过程中接触到了远程调用,jdk有自己的RMI实现,所以这边自己实现了RMI远程调用,并记录下心得. 感受最深的是RMI和现在的微服务有点相似,都是通过"注册中心&q ...

  4. WebService与RMI(远程调用方式实现系统间通信)

    前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...

  5. hession RMI 远程调用

    /** * * @author administror * 在java中,需要去extends 继承java.rmi.Remote 接口,才能称为在于服务器流的远程对象. * 各客服端调用 * */p ...

  6. Spring 配置RMI远程调用

    项目中遇到了跨系统调用,当初想的是用webservice或者是hessian.但是这个接口用到的并不多,而且是一个非常简单的方法.所有便想到了RMI.在spring中 实现RMI非常简单. 暴露服务: ...

  7. Spring的RMI远程调用 - (示例)

    一.定义远程服务器上接口 public interface RMIService { public String getInfo(); } 二.实现远程服务器上接口 public class RMIS ...

  8. Java中RMI远程调用demo

    Java远程方法调用,即Java RMI(Java Remote Method Invocation),一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远程服务器上的对象.远 ...

  9. java项目中rmi远程调用实例

    1.创建一个学生实体类Student.java: package com.RMIdemo.entity; @SuppressWarnings("serial") public cl ...

随机推荐

  1. Xcode 移除(卸载)插件

    1.command + shift + G ,输入 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 2.在Plug-ins文 ...

  2. C# Array

    一.声明数组时,方括号[]必须跟在类型后面,而不是标识符后面 int[] table;  //而不是 int table[]; 二.数组的大小不是其类型的一部分 int[] numbers; numb ...

  3. Nginx + php-fpm 执行 PHP 脚本超时 报错 502 Bad Gateway + 504 Gateway Time-out 的解决办法

    上周写好的发送邮件的计划任务只发送了一部分,检查计划任务日志,发现 502 Bad Gateway 的错误(已经在脚本中设置了 set_time_limit(0)). 后来在网上查找资料,可以通过以下 ...

  4. grep中正则匹配的使用

    如要匹配Computer或computer两个单词,可做如下操作: [Cc]mputer “.”允许匹配ASCII集中任意字符,或为字母,或为数字. 使用\{\}匹配模式结果出现的次数 匹配字母A出现 ...

  5. phpexcel 内存溢出 优化

    最近我们公司的项目的在导出excel的时候偶尔出现内存溢出错误,经过测试发现当数据量大于5000条就出现这个问题(默认php.ini memory 是128M) Allowed memory size ...

  6. cookbook学习第二弹

    1.5怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素 带有双下划线的方法,会在需要被调用的位置自动被调用 带有单下划线的变量是私有变量 下面利用类heap ...

  7. 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结

    List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...

  8. SQL Server 索引中include的魅力(具有包含性列的索引)

    2010-01-11 20:44 by 听风吹雨, 22580 阅读, 24 评论, 收藏, 编辑 开文之前首先要讲讲几个概念 [覆盖查询] 当索引包含查询引用的所有列时,它通常称为“覆盖查询”. [ ...

  9. vertical-align属性

    准备阶段 vertical-align取值及含义: 值 含义 baseline 默认.元素放置在父元素的基线上. top 把元素的顶端与行中最高元素的顶端对齐 text-top 把元素的顶端与父元素字 ...

  10. 实用命令dd

    1.命令简介 dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file #输入文件名,缺省为标准输入 ...