Spring-Security: использование собственного аутентификатора и пользовательской страницы входа - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь сделать первые шаги с помощью Spring Boot Security.

Я пытаюсь объединить пользовательский Аутентификатор с пользовательской страницей входа, и я не уверен, как их объединить. Оба они работают хорошо.

Мой пользовательский аутентификатор (Auth)

@Component
public class Auth implements AuthenticationProvider 
{
  @Override
  public Authentication authenticate (Authentication authentication) throws AuthenticationException
  {

    String name = authentication.getName ();
    String password = authentication.getCredentials().toString ();

    System.out.println ("auth: " + name + " / " + password);

    // no checks for now - any input is ok     
    return new UsernamePasswordAuthenticationToken (name, password, new ArrayList <GrantedAuthority> ());  
  }        

  @Override
  public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
  }
}

Мой конфигурационный файл безопасности (WebSecurity)

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter 
{
  @Override
  protected void configure (HttpSecurity http) throws Exception 
  {
    http.authorizeRequests ()
      .anyRequest ().authenticated ()
      .and ()
      .formLogin ()
       // .loginPage("/login").usernameParameter("username").passwordParameter("password")
      .permitAll ();
    }

    @Autowired
    private Auth authProvider;

    @Override
    protected void configure (AuthenticationManagerBuilder auth) throws Exception 
    {
      // register my custom authenticator here
      auth.authenticationProvider(authProvider);
    }
}

Мой обработчик для / логин (логин)

@RequestMapping ("/login")
public String login (HttpServletRequest request, Model model) 
{
  System.out.println("login")
  return "login";
}

Если я не использую пользовательскую страницу входа (.loginPage et c. В комментариях) мой кастом Аутентификатор используется, и встроенная страница входа в систему появляется.

Если я использую пользовательскую страницу входа в систему, тогда используется мой пользовательский логин. jsp, но я не вижу использования моего собственного аутентификатора. Но вызывается обработчик для / login.

Так должна ли комбинация пользовательского аутентификатора и страницы входа custon работать из коробки ИЛИ мне нужно склеивать их (возможно, в обработчике входа в систему) ??

РЕДАКТИРОВАТЬ

логин. jsp

<html>
    <body>
        MyLogin
        <form action="/security_check" method="post">               
            username<input type="text" id="username" name="username"/>        
            <br/>
            password<input type="password" id="password" name="password"/>    
            <br/>
            <input type="submit" value="login"/>
        </form>
   </body>
</html>

Моя новая конфигурация безопасности:

http.authorizeRequests ()
    .antMatchers ("/sec*").permitAll ()
    .anyRequest ().authenticated ()
    .and ()
    .formLogin ().loginPage("/login").loginProcessingUrl("/security_check")
    .permitAll ();

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

ваша конфигурация пользовательского аутентификатора верна. Проблема связана с вашей пользовательской страницей входа в систему.

, поэтому ваша пользовательская страница входа в систему должна включать как минимум форму с двумя полями: имя пользователя и пароль, а также действие POST для URL, например, «/ security_check», которое Spring Security обработает имя пользователя и пароль. И в вашей весенней конфигурации безопасности вы настроите его на loginProcessingUrl следующим образом:

.formLogin().loginPage("/login").loginProcessingUrl("/security_check").permitAll();

конечно, вы также можете указать параметр имени пользователя, параметр пароля, например, то, что вы делаете сейчас.

usernameParameter("username").passwordParameter("password")

часть, которую вы пропустили, была loginProcessingUrl, чтобы подключить вашу пользовательскую страницу входа с помощью Spring Security, которая будет использовать ваш собственный аутентификатор для аутентификации пользователя.

0 голосов
/ 16 апреля 2020

Обнаружил, что это работает, только если у меня есть скрытая информация на странице входа в систему.

<input type="hidden"
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>

Тогда мне не нужно

formLogin ().loginPage("/login")

в конфиге - ничего больше.

Не знаю почему, но я беру это.

У меня есть: https://www.logicbig.com/tutorials/spring-framework/spring-security/custom-login-page.html

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