2013-04-06 12 views
12

Mam projekt Spring MVC + Spring Security.Zapobieganie przekierowaniu do logowania do Spring Security

<http auto-config="true" access-denied-page="/security/accessDenied" use-expressions="true" disable-url-rewriting="true"> 

... 
<intercept-url pattern="/dashboard/myaccount/**" access="hasAnyRole('ROLE_PERSON', 'ROLE_DEALER')"/> 
... 

<form-login login-page="/security/login" authentication-failure-url="/security/login?error=true" 
       default-target-url="/security/success" username-parameter="email" 
       password-parameter="secret"/> 
<logout invalidate-session="true" logout-success-url="/index" logout-url="/security/logout"/> 

Jeśli użytkownik przechodzi do strony logowania, jeśli się powiedzie zostanie przekierowany do „/ security/sukces”, gdzie zrobić więcej rzeczy w sterowniku z przedmiotem sesji (nagrywanie USERID ... etc)

Mój problem polega na tym, że użytkownik GUEST przejdzie na dashboard/myaccount (co wymaga AUTH), zostaje przekierowany na stronę LOGIN (czego nie chcę, wolę 404). Po tym Spring Security nie przekierowuje do/security/success. Zamiast tego jest przekierowywany do/dashboard/myaccount.

Wolałbym znaleźć sposób całkowitego wyłączenia tego przekierowania na stronę logowania w przypadku, gdy GUEST próbuje uzyskać dostęp do strony AUTH.

Czy można to zrobić?

Tnx

Odpowiedz

5

Znalazłem to: zawsze-use-default-target = "true"

I w ten sposób, mój funkcji kontroler jest zawsze wywoływana po każdym logowaniu.

11

Dodajemy nową authenticationEntryPoint:

<http auto-config="true" access-denied-page="/security/accessDenied" use-expressions="true" 
     disable-url-rewriting="true" entry-point-ref="authenticationEntryPoint"/> 

<beans:bean id="authenticationEntryPoint" class="a.b.c..AuthenticationEntryPoint"> 
    <beans:constructor-arg name="loginUrl" value="/security/login"/> 
</beans:bean> 

public class AuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {  
    public AuthenticationEntryPoint(String loginUrl) { 
     super(loginUrl); 
    } 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { 
     response.sendError(403, "Forbidden"); 
    } 
} 
+1

Nie ma potrzeby, aby stworzyć swój własny AuthenticationEntryPoint, przeznaczenie: org. springframework.security.web.authentication.Http403ForbiddenEntryPoint – unify

+0

@Unify Cieszę się, że spojrzałem na Twój komentarz o wiele czystszy – ndrone

+0

Czy ty pl łatwość spojrzeć na moje pytanie też https://stackoverflow.com/q/47849246/2556354 – madz

2

W adnotacjami konfiguracji w SpringSecurity 4 można zrobić:

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    // .... 
    http.exceptionHandling().authenticationEntryPoint(new AuthenticationEntryPoint() { 

     @Override 
     public void commence(HttpServletRequest request, HttpServletResponse response, 
       AuthenticationException authException) throws IOException, ServletException { 
      if (authException != null) { 
       response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
       response.getWriter().print("Unauthorizated...."); 
      } 
     } 
    }); 
    // .... 
} 

}

+0

Znalazłem tę radę, pomagając mi w innej sytuacji. Dziękuję Ci – madz

Powiązane problemy