Spring MVC и редирект входа в систему - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть веб-приложение, когда пользователь нажимает на ссылку в личном профиле, если он не вошел в систему, я бы хотел перенаправить его на страницу входа, затем, когда он войдет в систему, я бы отправил его обратно в ссылку, по которой он первоначально щелкнул.

В данном случае его личный профиль.

Я выполнил часть до тех пор, пока не перенаправил его на страницу входа, но я пытаюсь выяснить, как запомнить его первоначальный щелчок и перенаправить на эту страницу после успешного входа в систему.

Я использую Spring Security для входа в систему.

Ответы [ 2 ]

8 голосов
/ 14 февраля 2012

К счастью, Spring Security имеет встроенную функциональность для запоминания первоначально запрошенного URL-адреса и перенаправления туда ваших пользователей после успешного входа в систему. Быстрый ответ на ваш вопрос заключается в том, что вам нужно включить эту функцию, установив для параметра always-use-default-target значение false в конфигурации Spring Security.

Например, вот общая строка из конфигурации Spring Security:

<form-login 
    login-page="/login.html"
    authentication-failure-url="/login.html?status=LOGIN_FAILURE"
    default-target-url="/secure/index.html"
    always-use-default-target="false" />

Эта конфигурация сделает возможными следующие два потока:

Поток 1

  1. Салли просит /login.html
  2. Салли предоставляет действительное имя пользователя и пароль
  3. Салли перенаправляется в /secure/index.html, поскольку это default-target-url

Поток № 2 (поток, который вы хотите)

  1. Дэвид просит /secure/kittens.html
  2. Поскольку Дэвид не вошел в систему, ему предоставляется страница входа в систему.
  3. После предоставления правильного имени пользователя и пароля, Дэвид перенаправляется на /secure/kittens.html - исходную страницу, к которой он пытался получить доступ. (Он не принимается за default-target-url , потому что always-use-default-target имеет значение false.)
4 голосов
/ 20 апреля 2016

Для тех из вас, кто использует Spring's JavaConfig, то же самое может быть достигнуто с помощью

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
         // authentication logic        
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        //password encoding logic
        //preferably BCrpyt
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
         // @formatter:off
         web.ignoring()
           .antMatchers("/css/**")     //Allow CSS resources.
           .antMatchers("/js/**")      //Allow JavaScript resources.
           .antMatchers("/images/**"); //Allow image resources.
         // @formatter:on
    }        
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/login.html")                       //login-page
            .failureUrl("/login.html?status=LOGIN_FAILURE") //authentication-failure-url
            .defaultSuccessUrl("/secure/index.html", false) //default-target-url. set always-use-default-target to `false`
            .permitAll()
        .and()
            .logout()
            .permitAll()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }
}

Приведенный выше фрагмент кода показывает конфигурацию без XML.

  1. Класс помечен @Configuration, указывающим, что

класс объявляет один или несколько методов @Bean и может обрабатываться контейнером Spring для генерации определений бинов и запросов на обслуживание этих бинов во время выполнения

  1. Класс помечен @EnableWebSecurity, который добавляет

эта аннотация для класса @Configuration для определения конфигурации Spring Security в любом WebSecurityConfigurer

  1. Этот класс также расширяется WebSecurityConfigurerAdapter, который

Предоставляет удобный базовый класс для создания экземпляра WebSecurityConfigurer. Реализация позволяет настраивать путем переопределения методов.

  1. Вы можете Autowire и AuthenticationManagerBuilder в публичном методе для обработки ваших потребностей аутентификации

Надеюсь, это поможет тем из вас, кто сталкивается с подобной проблемой и не использует конфигурацию XML.

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