Я использую Spring Security, и у меня большая проблема.
После того, как пользователь входит в систему и закрывает страницу, когда он снова входит в «mysite.com», он должен быть перенаправлен на «/ dashboard», но вместо этого он получает ошибку 404, страница не найдена.
Единственный способ для него снова войти в систему - это использовать другой браузер или сервер.
Что не так с моей конфигурацией ?? Он не перенаправляет на / дашборд, если он уже вошел в систему.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/settings", "/users", "/teams", "/docker-status", "/container-creation").hasAuthority("Administrator")
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.loginPage("/login").permitAll()
.defaultSuccessUrl("/dashboard")
.failureUrl("/login?error")
.successHandler(authenticationSuccessHandler)
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.logoutSuccessHandler(logoutSuccessHandler)
.and()
.exceptionHandling().accessDeniedHandler(accessDeniedHandler);
}




Форма и основные параметры входа
Вам может быть интересно, откуда взялась форма входа в систему, когда вам было предложено войти в систему, поскольку мы не упоминали какие-либо файлы HTML или JSP. Фактически, поскольку мы явно не установили URL-адрес для страницы входа, Spring Security генерирует его автоматически на основе включенных функций и с использованием стандартных значений для URL-адреса, который обрабатывает отправленный логин, целевой URL-адрес по умолчанию, который пользователь будет будут отправлены после входа в систему и т. д. Однако пространство имен предлагает большую поддержку, позволяющую настраивать эти параметры. Например, если вы хотите предоставить свою собственную страницу входа в систему, вы можете использовать:
<http>
<intercept-url pattern = "/login.jsp*" access = "IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern = "/**" access = "ROLE_USER" />
<form-login login-page='/login.jsp'/>
</http>
Также обратите внимание, что мы добавили дополнительный элемент URL-адрес перехвата, чтобы сказать, что любые запросы для страницы входа должны быть доступны анонимным пользователям [3], а также класс AuthenticatedVoter для получения дополнительных сведений о том, как обрабатывается значение IS_AUTHENTICATED_ANONYMOUSLY.]. В противном случае запрос будет соответствовать шаблону / **, и доступ к самой странице входа будет невозможен! Это распространенная ошибка конфигурации, которая приведет к бесконечному циклу в приложении. Spring Security выдаст предупреждение в журнале, если ваша страница входа окажется защищенной. Также возможно, чтобы все запросы, соответствующие определенному шаблону, полностью обходили цепочку фильтров безопасности, путем определения отдельного элемента http для шаблона следующим образом:
<http pattern = "/css/**" security = "none"/>
<http pattern = "/login.jsp*" security = "none"/>
<http use-expressions = "false">
<intercept-url pattern = "/**" access = "ROLE_USER" />
<form-login login-page='/login.jsp'/>
</http>
Начиная с Spring Security 3.1 теперь можно использовать несколько элементов http для определения отдельных конфигураций цепочки фильтров безопасности для разных шаблонов запросов. Если атрибут шаблона не указан в элементе http, он соответствует всем запросам. Создание незащищенного шаблона - простой пример этого синтаксиса, где шаблон отображается в пустую цепочку фильтров [4]. Мы рассмотрим этот новый синтаксис более подробно в главе, посвященной цепочке фильтров безопасности.
Важно понимать, что эти незащищенные запросы будут полностью игнорировать любую веб-конфигурацию Spring Security или дополнительные атрибуты, такие как requires-channel, поэтому вы не сможете получить доступ к информации о текущем пользователе или вызывать защищенные методы во время запроса. Используйте access = 'IS_AUTHENTICATED_ANONYMOUSLY' в качестве альтернативы, если вы по-прежнему хотите, чтобы цепочка фильтров безопасности применялась.
Если вы хотите использовать обычную аутентификацию вместо входа в систему, измените конфигурацию на
<http use-expressions = "false">
<intercept-url pattern = "/**" access = "ROLE_USER" />
<http-basic />
</http>
В этом случае обычная проверка подлинности будет иметь приоритет и будет использоваться для запроса входа в систему, когда пользователь пытается получить доступ к защищенному ресурсу. Форма входа в систему по-прежнему доступна в этой конфигурации, если вы хотите ее использовать, например, через форму входа, встроенную в другую веб-страницу.
Установка места назначения по умолчанию после входа в систему
Если при попытке доступа к защищенному ресурсу не появляется запрос на вход в систему, в игру вступает опция целевой URL по умолчанию. Это URL-адрес, по которому пользователь перейдет после успешного входа в систему, по умолчанию - «/». Вы также можете настроить все так, чтобы пользователь всегда попадал на эту страницу (независимо от того, был ли вход в систему «по запросу» или он явно выбрал вход в систему), установив для атрибута always-use-default-target значение «true» . Это полезно, если ваше приложение всегда требует, чтобы пользователь начинал с «домашней» страницы, например:
<http pattern = "/login.htm*" security = "none"/>
<http use-expressions = "false">
<intercept-url pattern='/**' access='ROLE_USER' />
<form-login login-page='/login.htm' default-target-url='/home.htm'
always-use-default-target='true' />
</http>
Для еще большего контроля над местом назначения вы можете использовать атрибут authentication-success-handler-ref в качестве альтернативы целевой URL по умолчанию. Указанный bean-компонент должен быть экземпляром AuthenticationSuccessHandler. Вы найдете больше об этом в главе «Основные фильтры», а также в приложении к пространству имен, а также информацию о том, как настроить поток при сбое аутентификации.
Я не слишком разбираюсь в рассматриваемом программном обеспечении, но видят ли неаутентифицированные пользователи 404 при переходе на эту страницу? Возможно, это не проблема 404, на самом деле это определенно не так, поскольку страница существует, скорее всего, файлы cookie не устанавливаются в браузере пользователя до того, как они будут перенаправлены.