Como manter o campo do username preenchido [Spring Security]

2 respostas Resolvido
java
E

Olá pessoal,

Gostaria de saber como eu posso manter o campo do username do login preenchido após ocorrer de algum usuário errar o login ou a senha. Ele apenas limpe o campo de senha.

Meu código do Spring security :

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
    @Autowired
    private UserDetailsService users;
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").anonymous()
            .anyRequest().authenticated()
            .and()
                .formLogin().loginPage("/login")
                    .defaultSuccessUrl("/")
                    .usernameParameter("username")
                    .passwordParameter("password")
            .and()
                .exceptionHandling().accessDeniedPage("/")
            .and()
                .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(users)
                .passwordEncoder(new BCryptPasswordEncoder());
    }
    @Override
    public void configure(WebSecurity web) throws Exception {
        web
            .ignoring()
                .antMatchers("/resources/**")
                .antMatchers("/webjars/**");
    }
}

Meu Controller:

@Controller
public class AuthController {
    @RequestMapping("/login")
    public ModelAndView login(){
        return new ModelAndView("auth/login");
    }
}

O HTML é o padrão para customização do login; Se for realmente pertinente eu posso postar eles para maiores dúvidas referente ao que há dentro do HTML.

Obrigada desde já.

2 Respostas

C

usando apenas o spring Securty creio que não tenha como, porém pode fazer uma organização de classes de forma que primeiro rode o javax.validation , ele sim grava os dados em sessão que pode ser retonados para sua jsp de forma simples, é até uma boa você adiciona para verifica erros de tamanho de senha e etc…

E
Solucao aceita

Oi @C0deuniversal,

Então na verdade talvez eu tenha me expressado errado.
Eu queria dizer quando você realiza o login, o Spring Security é encarregado de verificar se esse login existe para que ele posso ser validado e jogado na Sessão claro isso através de algumas devidas configurações para que ele entenda.
Pelo o que eu entendi sobre o que você explicou, você esta referindo a validação da spec do JPA que seria @NotNull @NotEmpty @Column etc…onde eu consigo capturar mensagem através de um “erro” para a página que foi submetida para que seja exibida.

Bom pelo que eu andei lendo em alguns foruns e sites essa validação pode ser customizada através da interface AuthenticationProvider mas mesmo assim ainda eu não tinha chegado na resposta para resolver a mesma pois ele somente consegue validar alguns campos e personalizar alguns exceções. Onde eu percebi (depois de muito tempo, dores de cabeça e enxaqueca) que na verdade eu precisava alterar a classe onde falhava o login que lança um BadCredentialsException e manda para a pagina referente que seria á SimpleUrlAuthenticationFailureHandler que é filha de AuthenticationFailureHandler, bom vamos ao exemplo.

@Component
public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        request.getSession().setAttribute("nome", request.getParameter("username"));
        response.sendRedirect("/login?error");
    }
}

onde eu referencio a Handle dentro das minha configuração do Spring Security (SecurityConfiguration.class no meu exemplo) e tenho uma referencia do nome para exibir .

protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").anonymous()
            .anyRequest().authenticated()
            .and()
                .formLogin().loginPage("/login")
                    .defaultSuccessUrl("/")
                    .failureHandler(new CustomAuthenticationFailureHandler()) // Aqui esta a "Customização"
            .and()
                .exceptionHandling().accessDeniedPage("/")
            .and()
                .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }

Ah muito obrigada @C0deuniversal mais uma vez pela resposta.

Mas se alguém tiver algum exemplo melhor ou diferente por favor poste aqui seu código

Criado 18 de junho de 2016
Ultima resposta 20 de jun. de 2016
Respostas 2
Participantes 2