Spring Security: перенаправление на страницу входа, если аутентификация не удалась - PullRequest
8 голосов
/ 28 марта 2011

У нас есть два способа входа в систему.

Имя пользователя и пароль отправляются другим приложением в заголовках запросов. Он проверяется, и если имя пользователя и пароль верны, он входит. [Для этого написан специальный фильтр] Если имя пользователя и пароль отсутствуют в заголовках запроса, отображается экран входа в систему.

Когда имя пользователя и пароль присутствуют в заголовке запроса и если это не так, мне показывается HTTP Status 401 - Ошибка аутентификации: неверные учетные данные страница.

Как мне сделать так, чтобы страница входа отображалась в случае неудачной аутентификации?

Ниже приведен код в security.xml

    <http auto-config="true" use-expressions="true">
             <access-denied-handler error-page="/login.jsp"/>
            <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/>
            <intercept-url pattern="/*" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')"/>
            <custom-filter ref="requestHeaderFilter" before="FORM_LOGIN_FILTER"/>
            <form-login login-page="/login.jsp"/>

    </http>

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Редактировать: добавление кода для фильтра RequestHeader в моем приложении

public class RequestHeaderProcessingFilter extends AbstractAuthenticationProcessingFilter{

private String usernameHeader = "j_username";
private String passwordHeader = "j_password";


protected RequestHeaderProcessingFilter() {
    super("/login_direct");
 }

//getters and setters

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
    String username = request.getHeader(usernameHeader);
    String password = request.getHeader(passwordHeader);

     SignedUsernamePasswordAuthenticationToken authRequest =
        new SignedUsernamePasswordAuthenticationToken(username, password);

      return this.getAuthenticationManager().authenticate(authRequest); 
}

}

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Чтобы отобразить страницу входа в случае неудачной аутентификации, у вас должен быть одинаковый URL в <access-denied-handler error-page="/login.jsp"/> и <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/>

, например:

<global-method-security secured-annotations="enabled" />

<http auto-config="true" access-denied-page="/app/sesiones/procesarLogin"> 
    <logout logout-success-url="/app/sesiones/login" />
    <form-login 
        authentication-failure-url="/app/sesiones/login?error=true"
        login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" />
    <intercept-url pattern="/app/privados/*" access="ROLE_USER" />
</http>

в этом примереПользователь также перенаправляется на страницу входа после выхода из системы./ ProcessarLogin - это метод, который отправляет пользователя на страницу login.jsp.

0 голосов
/ 07 января 2019

также можно попробовать это:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {

    .
    .
    .

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        .
        .
        .

        http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login").invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll();
    }
}

В методе configure вы можете добавить свой фильтр-конвейер и другие связанные вещи.также возможно настроить доступ к роли к определенным конечным точкам, как вы видите https://docs.spring.io/spring-security/site/docs/current/guides/html5/form-javaconfig.html

0 голосов
/ 28 марта 2011

По умолчанию при сбое аутентификации отображается состояние HTTP 401. В случае SimpleUrlAuthenticationFailureHandler используется для обработки сбоев (как это делается с помощью AbstractAuthenticationProcessingFilter, это поведение можно изменить, установив для defaultFailureUrl значение /login.jsp.

Альтернативно, пользовательский обработчик ошибок может быть определен с подходящим действием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...