Подтвердить что ты не робот

Запретить перенаправление для входа в систему для Spring Безопасность

У меня есть проект Spring MVC + Spring Безопасность.

<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"/>

Если пользователь переходит на страницу входа в систему, в случае успеха будет перенаправлен на "/security/success", где я делаю больше вещей в контроллере с помощью объекта сеанса (запись идентификатора пользователя... и т.д.)

Моя проблема в том, что пользователь GUEST собирается /dashboard/myaccount (который требует AUTH), он перенаправляется на страницу LOGIN (чего я не хочу, я предпочитаю бросок 404). После этого Spring Безопасность не перенаправляется на /security/success. Вместо этого перенаправляется на /dashboard/myaccount.

Я бы предпочел найти способ полностью отключить это перенаправление на странице входа в случае, если GUEST пытается получить доступ к странице AUTH.

Есть ли способ сделать это?

Тпх

4b9b3361

Ответ 1

Найдено следующее: always-use-default-target = "true"

Таким образом, моя функция-контроллер всегда вызывается после любого входа.

Ответ 2

Мы добавляем новый 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");
    }
}

Ответ 3

В аннотированной конфигурации в SpringSecurity 4 вы можете:

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....");
            }
        }
    });
    // ....
}

}