Spring Security. Эта страница не работает. Localhost перенаправлял вас слишком много раз. при попытке доступа к localhost:8080 с помощью Spring Security

Привет, я работаю над загрузочным веб-приложением Spring, в котором использую безопасность Spring, а для представлений использую страницы JSP. при попытке получить доступ к страницам, настроенным с помощью Permitall(), то есть домашней страницей и страницей входа в систему, я получаю эту ошибку в браузере, и на консоли ничего не выводится. поэтому после добавления регистратора я узнал, что функция контроллера вызывается неоднократно. Ниже приведен мой код и снимок экрана консоли для справки. Не могли бы вы сообщить мне, что я здесь делаю не так?

Файл Application.properties для страниц JSP.

server.error.path=/error 
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

Пейджконтроллер

@Controller
@RequestMapping(value = "/swadeshiBank/v1")
public class PageController {

    public static final Logger logger = LogManager.getLogger(PageController.class);


    private static final String loginPage = "login";


    @GetMapping(value = "/")
    public String homePage(){
        logger.info("Request Came to home :");
        return "home";
    }

    @GetMapping(value = "/login")
    public String getLoginPage(){
        logger.info("Request Came to login :");
        return loginPage;
    }

}

Конфигурация безопасности

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/swadeshiBank/v1/", "/swadeshiBank/v1/login").permitAll() // Public pages
                .requestMatchers("/swadeshiBank/v1/account-details").authenticated() // Authenticated users
                .requestMatchers("/swadeshiBank/v1/admin").hasRole("ADMIN") // Admin users
                .requestMatchers("/swadeshiBank/v1/management").hasRole("MANAGER") // Manager users
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/swadeshiBank/v1/login")
                .loginProcessingUrl("/swadeshiBank/v1/login") // URL to submit the login form
                .defaultSuccessUrl("/swadeshiBank/v1/account-details", true)
                .permitAll()
            )
            .logout(logout -> logout
                .logoutRequestMatcher(new AntPathRequestMatcher("/swadeshiBank/v1/logout"))
                .logoutSuccessUrl("/swadeshiBank/v1/login?logout")
                .invalidateHttpSession(true)
                .permitAll()
            );

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("user")
                .password("{noop}password")
                .roles("USER")
                .build());
        manager.createUser(User.withUsername("admin")
                .password("{noop}admin")
                .roles("ADMIN")
                .build());
        manager.createUser(User.withUsername("manager")
                .password("{noop}manager")
                .roles("MANAGER")
                .build());
        return manager;
    }
}

Структура проекта

Скриншот консоли

Скриншот браузера

Можете ли вы помочь мне здесь? кроме того, текущее поведение, которое я заметил, когда печатаю

http://localhost:8080/ в браузере я перехожу на http://localhost:8080/swadeshiBank/v1/login но я хочу, чтобы целевая страница была http://localhost:8080/swadeshiBank/ v1/ и страница входа должна появляться только тогда, когда я нажимаю кнопку входа в систему.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы установите для своего регистратора Spring-Security значение DEBUG, вы увидите, что Spring пытается получить доступ login.jsp как к защищенному ресурсу, то есть он блокирует файл с помощью своих функций безопасности.

Поскольку URL-адрес файла /WEB-INF/views/login.jsp не распознается ни одним из определенных вами средств сопоставления запросов, он разрешен только для аутентифицированных пользователей, поскольку это то, что вы установили для anyRequest() в своей http.authorizeHttpRequests() лямбда-функции. Это по-прежнему позволяет получить доступ к URL-адресу /login без аутентификации, но запрос к файлу login.jsp блокируется весной. Всякий раз, когда Spring блокирует запрос, он перенаправляет пользователя на страницу входа. Поскольку вы перенаправили URL-адрес /login на свою собственную конечную точку, это будет повторяться вечно, если бы не было жесткого ограничения на количество перенаправлений.

Чтобы решить вашу проблему, достаточно добавить конечную точку ресурса /WEB-INF/views/login.jsp к вашим средствам сопоставления запросов, у которых есть опция permitAll(), например:


// Class and stuff above

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/swadeshiBank/v1/", "/swadeshiBank/v1/login", "/WEB-INF/views/login.jsp").permitAll() // Public pages
                .requestMatchers("/swadeshiBank/v1/account-details").authenticated() // Authenticated users
                .requestMatchers("/swadeshiBank/v1/admin").hasRole("ADMIN") // Admin users
                .requestMatchers("/swadeshiBank/v1/management").hasRole("MANAGER") // Manager users
                .anyRequest().authenticated()
            )

// Your form-login-settings

// Your logout-settings

        return http.build();
    }

// Stuff below the method

Привет @Fi0x Спасибо за ответ. Можете ли вы помочь мне понять, как вы упомянули, что файл login.jsp блокируется, и Spring хочет, чтобы я сначала вошел в систему, поскольку я упомянул свой собственный URL-адрес для входа, поэтому он перенаправляется снова и снова, прежде чем получить доступ к каким-либо страницам JSP, будет ли это возможно, если я покажите home.jsp как целевую страницу, а затем нажмите кнопку «Войти». Этот вход отображается, поскольку я хочу, чтобы несколько страниц были доступны перед входом в систему. Благодарю за вашу помощь. Спасибо

shivam sharma 27.05.2024 21:38

По сути, вам нужно внести в «белый список» все конечные точки, которые вы хотите сделать доступными для общедоступных пользователей, что вы уже делаете. Но поскольку ваши конечные точки возвращают файлы .jsp, вам также необходимо внести их в «белый список». Для этого просто добавьте путь к файлу в папке ресурсов в файл requestMatchers. Это означает, что вам нужно добавить WEB-INF/views/login.jsp, как я показал в примере. Чтобы разрешить и другие конечные точки, вам также необходимо добавить их файлы .jsp. Вы также можете поместить все общедоступные файлы в папку и просто добавить всю папку, что упрощает задачу и делает ее менее запутанной.

Fi0x 27.05.2024 22:02

Другие вопросы по теме