zoukankan      html  css  js  c++  java
  • 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的权限

  • 相关阅读:
    leetcode 13. Roman to Integer
    python 判断是否为有效域名
    leetcode 169. Majority Element
    leetcode 733. Flood Fill
    最大信息系数——检测变量之间非线性相关性
    leetcode 453. Minimum Moves to Equal Array Elements
    leetcode 492. Construct the Rectangle
    leetcode 598. Range Addition II
    leetcode 349. Intersection of Two Arrays
    leetcode 171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/lifeone/p/4987874.html
Copyright © 2011-2022 走看看