页面重定向以处理Spring Security中的无效凭据

s6fujrry  于 2023-03-12  发布在  Spring
关注(0)|答案(1)|浏览(187)

我是Spring Security的新手,我确信我的问题与我的无知有关,当我输入正确的凭据时,一切正常,但当输入错误凭据时,Spring Security仍显示在/process_login页面上,并显示错误。我希望按照配置中的预期重新切换到/guest,并在页面上显示错误,也许您能告诉我一些信息
https://github.com/NikitaMozolevsky/KameleonTrialTask2
配置

package com.example.kameleontrialtask2.config;

import com.example.kameleontrialtask2.security.AuthProviderImpl;
import com.example.kameleontrialtask2.services.PersonDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@EnableWebSecurity //указывает на то, что конфигурационный класс SpringSecurity
//it permits use @PreAuthorise, SS will check role before executing method
//usually uses in services
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final PersonDetailsService personDetailsService;
    private final AuthProviderImpl authProvider;

    private final String[] allowedPages = new String[] {
            "/guest",
            "/registration",
            "/authorized",
            "/error",
            "/auth/registration",
            "/css/**"
    };

    @Autowired
    public SecurityConfig(PersonDetailsService personDetailsService, AuthProviderImpl authProvider) {
        this.personDetailsService = personDetailsService;
        this.authProvider = authProvider;
    }

    //настройка формы для логина
    @Override //переопределяется из WebSecurityConfigurerAdapter
    protected void configure(HttpSecurity http) throws Exception {
        //конфигурация страницы входа, выхода, ошибки и т.д.
        //конфигурация авторизации (доступ по роли к страницам)
        //работает с http
        http
                //попытка отправки злоумышленииком формы, для каких-то злоумышленных
                //дел, доджится токеном на каждой thymeleaf странице
                .csrf().disable() //отключение защиты от межсайтовой подделки запросов

                .authorizeHttpRequests()
                //страницы доступные админу
                //"ADMIN_ROLE" понимается как "ADMIN" автоматически SpSec
                //возможна работа не с ролью, а с Authorities
                //list of actions which user can do
                /**можно удалить и настраивать доступ к методам аннотацией
                 * @PreAuthorise*/
                .antMatchers("/admin").hasRole("ADMIN")
                //страницы доступные всем
                .antMatchers(allowedPages).permitAll()
                //для получения остальных страниц и пользователем и админом
                //can be deleted if will use @PreAuthorise and
                //@EnableGlobalMethodSecurity(prePostEnabled = true)
                //and mb something else
                .anyRequest().hasAnyRole("USER", "ADMIN")
                //остальные запросы недоступны
                /*.anyRequest().authenticated()*/ //при отсутствии admin ограничений
                .and() //and - объединитель разных настроек, настройка авторизации
                .formLogin()
                .loginPage("/guest") //метод захода в систему
                //SpringSecurity ожидает что сюда придут логин и пароль
                //SpringSecurity сам обрабатывает данные
                .loginProcessingUrl("/process_login")
                //unsuccessful with key error (located in view (th) show message)
                .failureForwardUrl("/guest")
                //что происходит при успешной аутентификации
                //перенаправление на /hello, true - всегда
                .defaultSuccessUrl("/authorized", true)
                .and()
                //удаление пользователя из сессии, удаление кукиз у пользователя
                .logout().logoutUrl("/logout")
                //redirect to this page after logout
                .logoutSuccessUrl("/auth/login");

    }

    //настраивает логику аутентификации
    //даем понять SpringSecurity что для аутентификации используется
    //именно этот AuthProviderImpl
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        /*auth.authenticationProvider(authProvider);*/

        auth.userDetailsService(personDetailsService)//упрощение, есть другая версия
                //прогоняет пароль через BCryptPasswordEncoder
                //при аутентификации
                .passwordEncoder(getPasswordEncoder());
    }

    @Bean //возвращается используемый алгоритм шифрования
    public PasswordEncoder getPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }


}

我试着配置为手动进行身份验证,但我认为SpringSecurity有更聪明的方法来完成它

66bbxpm5

66bbxpm51#

我很快就找到了答案,在Spring Configuration中,如果failureForwardUrl(“/guest”)方法中的凭据不正确,就不能转到同一个地址,需要将其改为另一个可以做同样事情的地址,例如failureforwardurl(“/guest_bad_credentials”)

相关问题