• cas的http配置和rmi远程调用


    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.修改casWEB-INFdeployerConfigContext.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.修改casWEB-INFspring-configuration icketGrantingTicketCookieGenerator.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的权限

  • 相关阅读:
    阿里巴巴2015年校招笔试附加题
    hadoop eclipse插件生成
    DevExpress控件的安装及画图控件的使用
    计算二进制数的0的个数
    Docker初探
    AppStore App申请审核加速
    _DataStructure_C_Impl:LinkListBasedSort
    rman数据库恢复;关键/非重要文件、影像副本、控制文件、还原点、非归档、增量、新数据库、灾难性回复
    RenderScript on LLVM笔记
    Oracle数据库备份恢复,巡检须要关注的对象设置以及相关恢复概述
  • 原文地址:https://www.cnblogs.com/lifeone/p/4987874.html
Copyright © 2020-2023  润新知