Jak egzekwować Zmień hasło przy pierwszym logowaniu użytkownika za pomocą Spring Security

Jaki byłby najbardziej elegancki sposób wprowadzenia zmiany hasła wymuszającego po wstępnym zalogowaniu użytkownika przy użyciu Spring Security?

Próbowałem wprowadzić zwyczajAuthenticationSuccessHandler jak wspomnianotutaj, ale jak wspomniano przezrodrigoapJeśli użytkownik ręcznie wprowadzi adres URL na pasku adresu, użytkownik nadal będzie mógł przejść do tej strony, nawet jeśli nie zmienił swojego hasła.

Zrobiłem to za pomocą filtra ForceChangePasswordFilter. Ponieważ jeśli użytkownik wpisze adres URL ręcznie, może pominąć formularz zmiany hasła. Dzięki filtrowi żądanie zawsze jest przechwytywane.

W związku z tym przystąpiłem do implementacji niestandardowego filtru.

Moje pytanie brzmi: kiedy implementuję niestandardowy filtr i wysyłam do niego przekierowanie, przechodzi ono ponownie przez filtr powodując nieskończoną pętlę przekierowania, jak wspomnianotutaj. Próbowałem wdrożyć wspomniane rozwiązanie, deklarując dwa znaczniki http w moim pliku security-context.xml z pierwszym znacznikiem o nazwiepattern atrybut jako taki, ale nadal przechodzi przez mój niestandardowy filtr:

<http pattern="/resources" security="none"/>
<http use-expressions="true" once-per-request="false"
    auto-config="true">
  <intercept-url pattern="/soapServices/**" access="permitAll" requires-channel="https"/>
  ...
  <custom-filter position="LAST" ref="passwordChangeFilter" />
</http>
...
<beans:bean id="passwordChangeFilter"
  class="my.package.ForcePasswordChangeFilter"/>
<beans:bean id="customAuthenticationSuccessHandler"
  class="my.package.CustomAuthenticationSuccessHandler" >
</beans:bean>
<beans:bean id="customAuthenticationFailureHandler"
  class="my.package.CustomAuthenticationFailureHandler" >
  <beans:property name="defaultFailureUrl" value="/login"/>
</beans:bean>

Moja obecna implementacja (która działa) to:

Wewnątrz mojej niestandardowej procedury obsługi uwierzytelniania ustawiam atrybut sesjiisFirstLoginW moim ForcePasswordChangeFilter sprawdzam, czy sesjaisFirstLogin jest ustawionyJeśli tak, to wysyłam przekierowanie do mojej zmiany hasła siłyJeszcze, dzwonięchain.doFilter()

Mój problem z tą implementacją polega na tym, że dostęp do folderu moich zasobów przechodzi również przez ten filtr, który powoduje, że moja strona jest zniekształcona (ponieważ pliki * .js i * .css nie zostały pomyślnie pobrane). To jest powód, dla którego próbowałem mieć dwa<http> tagi w mojej aplikacji context.xml bezpieczeństwa (która nie działa).

W związku z tym musiałem ręcznie filtrować żądanie, jeśli ścieżka servletPath zaczyna się lub zawiera „/ resources”. Nie chciałem, żeby tak było - musiałem ręcznie filtrować ścieżkę żądania - ale na razie to, co mam.

Jaki jest bardziej elegancki sposób na to?

questionAnswers(5)

yourAnswerToTheQuestion