2014-05-19 7 views
7

Meine Webanwendung hat eine Menge "normaler" Ressourcen (HTML-Seiten usw.) und auch einige REST-Ressourcen, die von JavaScript durch die zuvor erwähnten HTML-Seiten aufgerufen werden .Konfigurieren Sie Spring Security, um 403 für REST-URLs zurückzugeben und umzureichen für andere URLs

Wenn ein Sitzungszeitlimit vorliegt, wird der Benutzer zum Anmeldeformular weitergeleitet. Das ist großartig für die "normalen" Ressourcen, aber nicht für die REST-Ressourcen. Ich brauche nur eine Antwort von 403, damit das JavaScript übernehmen und den Benutzer zur erneuten Authentifizierung auffordern kann.

Es gibt unzählige Beispiele im Web, wie man jedes davon konfiguriert, aber ich konnte kein Beispiel finden, wie man die Methoden kombiniert. Alle meine API-URLs beginnen mit "/ api /", daher benötige ich den 403 für alle diese URLs und die Weiterleitung für alle verbleibenden URLs. Wie richte ich das ein?

Antwort

6

Es dauerte ein bisschen Spring Quellcode-Studie, um dies zur Arbeit zu bringen. Sie können einen Authentifizierungseintrittspunkt setzen sich wie folgt zusammen:

<bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint"> 
    <!-- this is the configuration for /api/ URLs --> 
    <constructor-arg> 
     <map> 
      <entry> 
       <key> 
        <bean class="org.springframework.security.web.util.matcher.RegexRequestMatcher"> 
         <constructor-arg value="^/api/.*" /><!-- match URLs starting with "/api/" --> 
         <constructor-arg><null /></constructor-arg><!-- no matter what the HTTP method is --> 
        </bean> 
       </key> 
       <!-- if the key above has matched, send 403 response --> 
       <bean class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" /> 
      </entry> 
     </map> 
    </constructor-arg> 

    <!-- and in the default case just redirect to login form --> 
    <property name="defaultEntryPoint"> 
     <bean class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
      <constructor-arg value="/spring_security_login" /> 
     </bean> 
    </property> 
</bean> 

Dies kann dann in der Sping Sicherheitskonfiguration verwendet werden:

<http ... entry-point-ref="authenticationEntryPoint"> 
0

Ich denke, dass Sie nur zwei verschiedene <http pattern="{...}" ...> Entitäten haben sollte, weil, ok, du hast das problem mit der redirect gelöst, aber was ist mit csrf protection? Und andere Probleme, die mir nicht in den Sinn kommen.

Verwandte Themen