Как подключиться к процессу аутентификации Spring Security? - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время у меня есть эта тривиальная конфигурация:

// Kotlin code
override fun configure(http: HttpSecurity) {
    http
        .formLogin()
        .loginPage("/entry")
        .loginProcessingUrl("/auth")
        .usernameParameter("usr")
        .passwordParameter("pwd")
        .defaultSuccessUrl("/", true)
        .failureHandler { request, response, exception -> 
            // Can't figure out what to enter here (see below).
        }
}

Если аутентификация не удалась, у меня есть два требования:

  1. Flash-сообщение об ошибке в сеанс (избегая 'ошибкапараметр в строке запроса).Кажется, я не могу ввести RedirectAttributes в эту лямбду;есть ли обходной путь?

  2. Я хочу отправить обратно логин (но не пароль), который пользователь ввел перед отправкой формы входа, чтобы заполнить поле.Как мне это сделать?

1 Ответ

0 голосов
/ 13 октября 2018

Мне удалось выяснить это.

@Configuration
@EnableWebSecurity
class SecurityConfig: WebSecurityConfigurerAdapter() {
    override fun configure(http: HttpSecurity) {
        http
            .formLogin()
            .loginPage("/entry")
            .loginProcessingUrl("/auth")
            .usernameParameter("usr")
            .passwordParameter("pwd")
            .defaultSuccessUrl("/", true)
            .failureHandler { request, response, _ ->
                request.session.setAttribute("loginError", "Login Error!")
                request.session.setAttribute("failedUsername", request.getParameter("usr"))
                response.sendRedirect("/entry")
            }
    }
}

Затем вам нужно настроить контроллер входа в систему для настройки обслуживания формы входа в систему:

@Controller
@RequestMapping("/entry")
internal class LoginController {
    @GetMapping
    fun getLoginForm(session: HttpSession, model: Model): String {
        if (session.getAttribute("loginError") != null) {
            model.addAttribute("loginError", "Login Error!")
            session.removeAttribute("loginError")
            model.addAttribute("failedUsername", session.getAttribute("failedUsername"))
            session.removeAttribute("failedUsername")
        }
        return "login"
    }
}

Затем вы можете использоватьloginError и failedUsername атрибуты модели в ваших шаблонах:

<div th:if="${loginError}">Incorrect login/password</div>
<!-- ... -->
<input type="text" name="usr" th:value="${failedUsername}">

По сути, мы эмулируем "мигание" сообщений в сеанс.Мы несем эти сообщения в сеансе и удаляем их, как только они прочитаны и переданы в модель.Возможно, что перенаправление пойдет не так, и сообщения останутся в сеансе, но они безвредны сами по себе, плюс они будут удалены при следующем посещении страницы /entry.

В результате теперь существуетв URL-адресе страницы отсутствует ?error, и пользователю не требуется повторно вводить имя пользователя.

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