2012-06-25 42 views
0

我有一個使用LDAP進行身份驗證和授權的Spring 3項目。我們知道將該項目更改爲使用CAS進行身份驗證,但仍然像使用LDAP一樣工作。可有人請看看這個XML文件,並告訴我如何讓LDAP機構背部和工作使用CAS進行身份驗證和LDAP授權的春季項目

<?xml version="1.0" encoding="UTF-8"?> 
<b:beans xmlns:b="http://www.springframework.org/schema/beans" 
    xmlns="http://www.springframework.org/schema/security" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <http entry-point-ref="casEntryPoint" use-expressions="true"> 
     <intercept-url pattern="/" access="permitAll" /> 

     <intercept-url pattern="/index.jsp" access="permitAll" /> 
     <intercept-url pattern="/cas-logout.jsp" access="permitAll" /> 
     <intercept-url pattern="/casfailed.jsp" access="permitAll" /> 

     <intercept-url pattern="/secure/**" access="hasRole('ROLE_USER')" /> 
     <intercept-url pattern="/requests/**" access="hasRole('ROLE_MEMBER_INQUIRY')" /> 

     <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER" /> 
     <custom-filter ref="singleLogoutFilter" before="CAS_FILTER" /> 
     <custom-filter ref="casFilter" position="CAS_FILTER" /> 


     <logout logout-success-url="/cas-logout.jsp" /> 
    </http> 

    <authentication-manager alias="authManager"> 
     <authentication-provider ref="casAuthProvider" /> 
    </authentication-manager> 


    <user-service id="userService"> 
     <user name="rod" password="rod" authorities="ROLE_SUPERVISOR,ROLE_USER" /> 
     <user name="[email protected]" password="testing" 
      authorities="ROLE_MEMBER_INQUIRY" /> 
    </user-service> 

    <!-- This filter handles a Single Logout Request from the CAS Server --> 
    <b:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter" /> 
    <!-- This filter redirects to the CAS Server to signal Single Logout should 
     be performed --> 
    <b:bean id="requestSingleLogoutFilter" 
     class="org.springframework.security.web.authentication.logout.LogoutFilter" 
     p:filterProcessesUrl="/j_spring_cas_security_logout"> 
     <b:constructor-arg 
      value="https://${cas.server.host}/cas-server-webapp/logout" /> 
     <b:constructor-arg> 
      <b:bean 
       class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" /> 
     </b:constructor-arg> 
    </b:bean> 

    <b:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties" 
     p:service="https://${cas.service.host}/MemberInquiry/j_spring_cas_security_check" 
     p:authenticateAllArtifacts="true" /> 

    <b:bean id="casEntryPoint" 
     class="org.springframework.security.cas.web.CasAuthenticationEntryPoint" 
     p:serviceProperties-ref="serviceProperties" 
     p:loginUrl="https://${cas.server.host}/cas-server-webapp/login" /> 

    <b:bean id="casFilter" 
     class="org.springframework.security.cas.web.CasAuthenticationFilter" 
     p:authenticationManager-ref="authManager" p:serviceProperties-ref="serviceProperties" 
     p:proxyGrantingTicketStorage-ref="pgtStorage" 
     p:proxyReceptorUrl="/j_spring_cas_security_proxyreceptor"> 
     <b:property name="authenticationDetailsSource"> 
      <b:bean 
       class="org.springframework.security.cas.web.authentication.ServiceAuthenticationDetailsSource" /> 
     </b:property> 

     <b:property name="authenticationFailureHandler"> 
      <b:bean 
       class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler" 
       p:defaultFailureUrl="/casfailed.jsp" /> 
     </b:property> 


     <b:property name="authenticationSuccessHandler"> 
      <b:bean 
       class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler" 
       p:defaultTargetUrl="/requests/add.html" /> 
     </b:property> 
    </b:bean> 
    <!-- NOTE: In a real application you should not use an in memory implementation. 
     You will also want to ensure to clean up expired tickets by calling ProxyGrantingTicketStorage.cleanup() --> 
    <b:bean id="pgtStorage" 
     class="org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl" /> 
    <b:bean id="casAuthProvider" 
     class="org.springframework.security.cas.authentication.CasAuthenticationProvider" 
     p:serviceProperties-ref="serviceProperties" p:key="casAuthProviderKey"> 
     <b:property name="authenticationUserDetailsService"> 
      <b:bean 
       class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
       <b:constructor-arg ref="userService" /> 
      </b:bean> 
     </b:property> 
     <b:property name="ticketValidator"> 
      <b:bean class="org.jasig.cas.client.validation.Cas20ProxyTicketValidator" 
       p:acceptAnyProxy="true" 
       p:proxyCallbackUrl="https://${cas.service.host}/MemberInquiry/j_spring_cas_security_proxyreceptor" 
       p:proxyGrantingTicketStorage-ref="pgtStorage"> 
       <b:constructor-arg value="https://${cas.server.host}/cas-server-webapp" /> 
      </b:bean> 
     </b:property> 
     <b:property name="statelessTicketCache"> 
      <b:bean 
       class="org.springframework.security.cas.authentication.EhCacheBasedTicketCache"> 
       <b:property name="cache"> 
        <b:bean class="net.sf.ehcache.Cache" init-method="initialise" 
         destroy-method="dispose"> 
         <b:constructor-arg value="casTickets" /> 
         <b:constructor-arg value="50" /> 
         <b:constructor-arg value="true" /> 
         <b:constructor-arg value="false" /> 
         <b:constructor-arg value="3600" /> 
         <b:constructor-arg value="900" /> 
        </b:bean> 
       </b:property> 
      </b:bean> 
     </b:property> 
    </b:bean> 

    <!-- Configuration for the environment can be overriden by system properties --> 
    <context:property-placeholder 
     system-properties-mode="OVERRIDE" properties-ref="environment" /> 

    <util:properties id="environment"> 
     <b:prop key="cas.service.host">wcmisdlin07.uftmasterad.org:8443</b:prop> 
     <b:prop key="cas.server.host">wcmisdlin07.uftmasterad.org:8443</b:prop> 
    </util:properties> 


    <b:bean id="contextSource" 
     class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 

     <b:constructor-arg 
      value="ldaps://dvldap01.uftwf.dev:636/dc=uftwf,dc=dev" /> 

     <b:property name="userDn" value="cn=Manager,dc=uftwf,dc=dev" /> 

     <b:property name="password" value="uftwf" /> 
    </b:bean> 

     <b:bean id="ldapAuthProvider" 
     class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 

     <b:constructor-arg> 

      <b:bean 
       class="org.springframework.security.ldap.authentication.BindAuthenticator"> 
       <b:constructor-arg ref="contextSource" /> 
       <b:property name="userDnPatterns"> 
        <b:list> 
         <b:value> 
          uid={0},ou=webusers 
         </b:value> 
        </b:list> 
       </b:property> 
      </b:bean> 
     </b:constructor-arg> 
     <b:constructor-arg> 
      <b:bean 
       class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"> 
       <b:constructor-arg ref="contextSource" /> 
       <b:constructor-arg value="ou=groups" /> 
       <b:property name="groupRoleAttribute" value="ou" /> 
      </b:bean> 
     </b:constructor-arg> 
    </b:bean> 
    <ldap-server url="ldaps://dvldap01.uftwf.dev:636/dc=uftwf,dc=dev" /> 




</b:beans> 

回答

2

你需要有LdapUserDetailsService更換內存UserDetailsService豆(userService)。如果您以前使用LDAP進行身份驗證,則假設CAS返回的用戶名可以輕鬆映射到目錄中,則配置應該幾乎相同。

的詳細信息:您目前有一個bean叫userService它是使用命名空間創建:

<user-service id="userService"> 
    <user name="rod" password="rod" authorities="ROLE_SUPERVISOR,ROLE_USER" /> 
    <user name="[email protected]" password="testing" 
     authorities="ROLE_MEMBER_INQUIRY" /> 
</user-service> 

你需要一個看起來像這樣的東西代替它:

<ldap-user-service id="userService" 
    server-ref="yourLdapServer" 
    user-search-base="ou=people" 
    user-search-filter="(uid={0})" 
    group-search-base="ou=groups" 
    group-role-attribute="cn" 
    group-search-filter="(member={0})" 
    role-prefix="ROLE_" /> 

但將各種屬性設置爲與您的目錄配置相匹配。在轉移到CAS之前,它們應與您在<ldap-authentication-provider>配置中的任何配置類似。您還需要聲明<ldap-server>元素以指向目錄服務器。再次,這應該符合你以前的。

+0

是你有這個 – user1472384

+0

的任何例子如果你的意思是使用'ldap-user-service',細節將取決於你的目錄是如何設置的。正如我所說的,XML配置屬性應該與之前的類似。如果您搜索,您會找到示例,如[this one](http://stackoverflow.com/a/8422203/241990)。 –

+0

對不起,我還沒有站在如何改變用戶服務是我的老ldap一個 – user1472384