2012-08-14 11 views
9

Mam skonfigurowane zabezpieczenia sprężynowe przy użyciu uwierzytelniania podstawowego i formularza, zgodnie z auto-config='true'.Jak mogę wyłączyć logowanie oparte na formularzu sprężynowym dla RESTful punktów końcowych?

Chciałbym, aby punkty końcowe pod numerem /api/** NIE używały zabezpieczeń opartych na formularzach. Inne punkty końcowe spoza /api/** powinny używać logowania opartego na formularzu. Chciałbym otrzymać odpowiedź 401 na każde połączenie dla tych punktów końcowych, którzy nie podali poświadczeń pod numerem /api/**.

UPDATE: Dzięki komentarzowi Luke'a Taylora poniżej wymyśliłem następujące rozwiązanie.

UWAGA: Ta technika może być stosowana tylko od wiosny bezpieczeństwa 3.1.

Najpierw wybieram /api/**. Nigdy nie tworzymy sesji, ale używamy jednej, jeśli jest dostępna, jest ona obsługiwana przez create-session="never" i użycie <session-management/>.

<http pattern="/api/**" create-session="never" use-expressions="true"> 
    <http-basic /> 
    <session-management /> 
    <intercept-url pattern="/api/**" access="hasRole('API_ACCESS')"/> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/" access="permitAll"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
</http> 
+1

Zobacz tutaj http://www.baeldung.com/2011/10/31/securing-a-restful-web-service- with-spring-security-3-1-part-3/. W tym samouczku znajdziesz odpowiedzi na swoje pytania. – dimas

+1

Zobacz moją odpowiedź na [to pytanie] (http://stackoverflow.com/questions/9302795/handling-oth-form-and-http-basic-authentication-with-different-sources), która zasadniczo pyta o to samo. –

+0

Cześć Luke, teoretycznie wygląda to na to, czego szukam i zbadam zastosowanie. Posiadając wiele znaczników ' ', mogą one przypadkowo obsłużyć żądanie? Może mogę użyć Spel, aby dopasować coś innego niż '/ api'. Nie wiedziałem, że na wiosnę - bezpieczeństwo 3.1 pozwalają teraz na wiele znaczników '', to dobrze. –

Odpowiedz

19

ze sprężyną bezpieczeństwa 3.1, najlepszym rozwiązaniem jest, aby podzielić spokojny i nie-spokojny części aplikacji w oddzielnych łańcuchów filtrów przy użyciu dwóch oddzielnych <http> elementy. Restful łańcuch API może zostać skonfigurowany jako bezstanowy i używać podstawowego uwierzytelniania, podczas gdy łańcuch domyślny może korzystać z normalnej konfiguracji logowania do formularza.

Będziesz wtedy coś takiego:

<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/api/**" access="ROLE_API_USER" /> 
    <http-basic />   
</http> 

<!-- No pattern attribute, so defaults to matching any request --> 
<http> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login />   
</http> 

Definicje łańcuchowe muszą być zamówione z najbardziej określony sposób najbardziej ogólny, więc łańcuch domyślny jest ostatni.

+0

Doskonały Luke, bardzo dziękuję za opublikowanie odpowiedzi. Powinienem przeczytać dokumenty 3.1, aby odkryć to jako małą, ale potężną nową funkcję. :) –

+0

Myślę, że atrybut create-session musi być ustawiony na "create-session =" never "" jak na ten post: http://stackoverflow.com/questions/16914985/spring-security-either-http-basic- lub -form-login-authentication – lanoxx

+0

@lanoxx nie, jeśli chcesz, aby twoja aplikacja była całkowicie bezpaństwowa i nigdy nie miała sesji. –

Powiązane problemy