2012-06-05 2 views
5

Ich verwende zwei verschiedene Web-Anwendung in der gleichen Tomcat-Instanz bereitgestellt. Eine der Web-Anwendungen und eine andere sind REST-Dienste. Wenn sich ein Benutzer bei der Webanwendung anmeldet und den REST-Service aufruft, sollte sich REST mit dem Benutzer authentifizieren, der mit der Webanwendung angemeldet ist. Wie kann ich SSO in Tomcat implementieren> Wenn jemand es implementiert haben, bitte helfen Sie MW.Web-Anwendung und REST-Dienste SSO in Tomcat und Feder-Sicherheit

Update: ich die Spring Security und J2EEPreAuthentication Mechanismus in meiner ersten Web-Anwendung implementiert haben. Diese Anwendung ruft die zweite Anwendung (REST-Dienste) mit dem DOJO (JavaScript Framework) auf.

Update: Ich habe die Lösung gefunden. Bitte lesen Sie meine Antwort unten.

Antwort

6

Wir können die SSO zwischen herkömmlicher Web-Anwendung und nicht-webbasierte Anwendung wie der RESTful Web-Service implementieren. Dieses Beispiel zeigt den Beispielcode für die Implementierung des SSO zwischen Webanwendung und RESTful-Webdiensten. Im Folgenden ist die Konfiguration in der Datei spring-security.xml

<security:http create-session="never" use-expressions="true" 
        auto-config="false" 
        entry-point-ref="preAuthenticatedProcessingFilterEntryPoint" > 

     <security:intercept-url pattern="/**" access="permitAll"/> 
     <security:intercept-url pattern="/admin/**" access="hasRole('tomcat')"/> 
     <security:intercept-url pattern="/**" access="hasRole('tomcat')"/> 
     <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter"/> 
     <!-- Required for Tomcat, will prompt for username/password twice otherwise --> 
     <security:session-management session-fixation-protection="none"/> 
    </security:http> 

    <bean id="preAuthenticatedProcessingFilterEntryPoint" 
       class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> 

    <bean id="preAuthFilter" 
       class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter"> 
     <property name="authenticationManager" ref="appControlAuthenticationManager"/> 
     <property name="authenticationDetailsSource" 
         ref="j2eeBasedPreAuthenticatedWebAuthenticationDetailsSource"/> 
    </bean> 

    <security:authentication-manager alias="appControlAuthenticationManager"> 
     <security:authentication-provider ref="preAuthenticatedAuthenticationProvider"/> 
    </security:authentication-manager> 

    <bean id="preAuthenticatedAuthenticationProvider" 
       class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
     <property name="preAuthenticatedUserDetailsService" ref="inMemoryAuthenticationUserDetailsService"/> 
    </bean> 

    <bean id="j2eeBasedPreAuthenticatedWebAuthenticationDetailsSource" 
       class="org.springframework.security.web.authentication.preauth.j2ee.J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource"> 
     <property name="mappableRolesRetriever" ref="webXmlMappableAttributesRetriever"/> 
     <property name="userRoles2GrantedAuthoritiesMapper" ref="simpleAttributes2GrantedAuthoritiesMapper"/> 
    </bean> 

    <bean id="webXmlMappableAttributesRetriever" 
       class="org.springframework.security.web.authentication.preauth.j2ee.WebXmlMappableAttributesRetriever"/> 

    <bean id="simpleAttributes2GrantedAuthoritiesMapper" 
       class="org.springframework.security.core.authority.mapping.SimpleAttributes2GrantedAuthoritiesMapper"> 
     <property name="attributePrefix" value=""/> 
    </bean> 

    <bean id="inMemoryAuthenticationUserDetailsService" 
       class="com.org.InMemoryAuthenticationUserDetailsService"/> 

Der obige Code ist in der Web-Anwendung. Derselbe Code kann auch in der Quellsicherheits-XML-Datei des REST-Projekts enthalten sein. Fügen Sie den folgenden Code in die Datei web.xml:

<security-constraint> 
     <web-resource-collection> 
      <web-resource-name>Wildcard means whole app requires authentication</web-resource-name> 
      <url-pattern>/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>tomcat</role-name> 
     </auth-constraint> 

     <user-data-constraint> 
      <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE --> 
      <transport-guarantee>NONE</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 
    <login-config> 
     <auth-method>FORM</auth-method> 
     <form-login-config> 
      <form-login-page>/login.jsp</form-login-page> 
      <form-error-page>/error.jsp</form-error-page> 
     </form-login-config> 
    </login-config> 

Der obige Code nur in der normalen Web-Anwendung sein sollte. Aktivieren Sie dann das SSO-Ventil in der Datei server.xml des Katers. Tomcat verwendet die Cookie-basierte SSO-Anmeldung. Die Sitzungs-IDs werden in den Cookies gespeichert. Wenn Ihr Browser den Cookie deaktiviert hat, funktioniert SSO nicht.

Hoffnung diese Erklärung hilft.

1

Tomcat bietet standardmäßig SSO-Funktionen (mit Konfiguration), arbeitet jedoch mit eigenen Authentifizierungsmechanismen. Ich glaube nicht, dass Sie das containerverwaltete SSO von Tomcat mit einem von der Anwendung verwalteten Authentifizierungsmechanismus (Spring in diesem Fall) kombinieren können.

Sie sollten sich die SSO-Funktionen von Spring ansehen, sofern diese vorhanden sind.

+0

Wir können mithilfe der J2EEPreAutenticationProvider die tomcat-Authentifizierung mit Feder mischen. Das könnte ich machen. Aber ich brauche SSO-Implementierung für die REST-Dienste und eine andere normale Webanwendung – Krishna