Spring-Security: utilisation d'un authentificateur personnalisé ET d'une page de connexion personnalisée


chris01:

J'essaie de faire les premiers pas avec Spring Boot Security.

J'essaie de combiner un authentificateur personnalisé avec une page de connexion personnalisée et je ne sais pas comment les combiner. Les deux seuls fonctionnent bien.

Mon authentificateur personnalisé (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);
  }
}

Ma configuration de sécurité (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);
    }
}

Mon gestionnaire pour / login (login)

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

Si je n'utilise pas la page de connexion personnalisée (.loginPage, etc. dans les commentaires), mon authentificateur personnalisé est en cours d'utilisation et la page de connexion intégrée apparaît.

Si j'utilise la page de connexion personnalisée, mon login.jsp personnalisé est utilisé mais je ne vois aucune utilisation de mon authentificateur personnalisé. Mais le gestionnaire de / login est appelé.

Donc, la combinaison d'un authentificateur personnalisé et d'une page de connexion personnalisée devrait-elle fonctionner hors de la boîte OU dois-je les coller ensemble (dans le gestionnaire de connexion peut-être)?

ÉDITER

login.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>

Ma nouvelle configuration de sécurité:

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

J'ai découvert que cela ne fonctionne que si j'ai une information cachée dans la page de connexion.

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

Alors je n'ai pas besoin

formLogin ().loginPage("/login")

dans la config - rien de plus.

Je ne sais pas pourquoi mais je le prends.

Je l'ai depuis: https://www.logicbig.com/tutorials/spring-framework/spring-security/custom-login-page.html

Articles connexes