Как сделать редирект при logout'е?

302
15 августа 2021, 08:50

Я написал приложение с использованием spring boot. Добавил авторизацию:

@Override
protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                .antMatchers("/","/registration", "/main").permitAll()
                .anyRequest().authenticated()
            .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
                .logout()
                .permitAll();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication()
            .dataSource(dataSource)
            .passwordEncoder(NoOpPasswordEncoder.getInstance())
            .usersByUsernameQuery("select username, password, active from users where username = ?")
            .authoritiesByUsernameQuery("select u.username, ur.roles from users u inner join user_roles ur on u.id = ur.user_id where u.username=?");
}

Использую freemarker и на одной из ftl страниц написал кнопку logout:

<div>
     <form action="/logout" method="post">
         <div><input type="hidden" name="_csrf" value="${_csrf.token}"/></div>
         <input type="submit" value="Log Out"/>
     </form>
</div>

Проблема такая: когда я совершаю логаут, меня перекидывает на такой адрес - localhost/login?logout. И если я попытаюсь снова залогиниться, то меня выкидывает в корень, который у меня не замапен в контроллерах(localhost/), а я хотел бы, чтобы я просто мог снова залогиниться и пройти дальше. Если я руками в адресной строке пропишу нужный мне адрес, то потом я могу нормально логиниться. Как можно сделать редирект на нужный мне адрес, после того как я разлогиниваюсь?

Answer 1
.logout()
.logoutSuccessUrl("/")
Answer 2

Я заметил у вас проблема и с логином какие-то? В общем у меня есть примерчик... В конфиге:

@Override
protected void configure(HttpSecurity http) throws Exception {
    String[] matchers = {"/", "/ua", "/en", "/css/**", "/js/**", "/lib/**", "/img/**", "/user", "/en/seance/*", "/ua/seance/*"};
    http
    .authorizeRequests()
    .antMatchers(matchers).permitAll().anyRequest().authenticated()
    .and()
        .formLogin()
        .usernameParameter("email")
        .loginProcessingUrl("/login")
        .failureHandler(new SimpleUrlAuthenticationFailureHandler())
        .permitAll()
    .and()
        .exceptionHandling()
        .authenticationEntryPoint(getAuthenticationEntryPoint())
    .and()
        .logout()
        .logoutSuccessUrl("/?logout")
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .permitAll();
}
private AuthenticationEntryPoint getAuthenticationEntryPoint() {
    return new AuthenticationEntryPoint() {
        @Override
        public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
            response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.toString());
        }
    };
}

Форма которая в шапке сайта и выпадает в модальном окне (см. Bootstrap Modal Form). Также там Thymeleaf, но думаю вы его адаптируете под Freemarker:

<form method="POST" action="/login" id="login-form" class="needs-validation" novalidate>
                                <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
                                <div class="alertify-log alertify-log-error alertify-log-show"
                                    style="display:none;margin-top:0">
                                    [[ #{login.invalid} ]]
                                </div>
                                <div class="md-form form-sm">
                                    <i class="fas fa-envelope prefix active"></i>
                                    <input type="text" name="email" id="form2" class="form-control form-control-sm"
                                        required>
                                    <label for="form2" class="active">[[ #{login.email} ]]</label>
                                    <div class="invalid-feedback">
                                        [[ #{login.email.invalid} ]]
                                    </div>
                                </div>
                                <div class="md-form form-sm">
                                    <i class="fas fa-lock prefix"></i>
                                    <input type="password" name="password" id="form3"
                                        class="form-control form-control-sm" required>
                                    <label for="form3">[[ #{login.password} ]]</label>
                                    <div class="invalid-feedback">
                                        [[ #{login.password.invalid} ]]
                                    </div>
                                </div>
                                <div class="text-center mt-4">
                                    <button type="submit" class="btn btn-info waves-effect waves-light">
                                        [[ #{login} ]]
                                        <i class="fas fa-sign-in ml-1"></i>
                                    </button>
                                </div>
                            </form>

Обработчик формы на JS (Ajax/Jquery):

$('#login-form').submit(function (event) {
    event.preventDefault(); // Cancel
    var form = $(this);
    if (form[0].checkValidity() === false) {
        return;
    }
    var invalidData = form.find(".alertify-log-error");
    var email = form.find('input[name="email"]');
    var password = form.find('input[name="password"]');
    var _csrf = form.find('input[name="_csrf"]');
    var data = {
        email: email.val(),
        password: password.val(),
        _csrf: _csrf.val()
    };
    $.ajax({
        data: data,
        timeout: 1000,
        type: 'POST',
        url: '/login'
    }).done((responseText, statusText, response) => {
        invalidData.hide();
        window.location.href = "/?logged";
    }).fail((response, statusText) => {
        password.val('');
        invalidData.show();
    });
});

Ну а кнопка логаута выглядит как-то так тоже в шапке сайта:

    <a sec:authorize="isAuthenticated()" class="dropdown-item logout" href="/logout">[[#{logout}]]</a>
READ ALSO
Вопрос по ООП java

Вопрос по ООП java

Есть основной класс Main и класс Person в классе Person есть метод draw(), что-бы исползовать этот метод в классе Main надо создать объект Person maks = new Person()...

273
Ошибки после выполения

Ошибки после выполения

Задача на java: написать программу, что будет выводить все дни твоего рождения на 5 лет вперед двумя способами: просто все в main, что изи, и с помощью...

317
Трассировка стека исключений в Java

Трассировка стека исключений в Java

Метод fillInStackTrace(), реализованный в классе Throwable позволяет получить объект типа Throwable, с сохранением трассировки стека вызывающего объекта...

307
Как вызвать NullPointerException в Java, не используя throw?

Как вызвать NullPointerException в Java, не используя throw?

Нужен наиболее простой способ вызвать NullPointerException

147