Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvidas no login/logout do Spring-security

Olá,

estou tentando configurar o Spring Security para controle de segurança de minha aplicação. Minha aplicação usa JSF 2.2 e estou um pouco perdido para gerenciar os erros na minha tela, acredito que o Spring seja o responsável pelo gerenciamento dessa página e minhas anotações de required e messages do JSF não estão funcionando.

Seguem as classes iniciais do projeto:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Login</title>

        <h:outputStylesheet library="css" name="sistema.css"/>
    </h:head>
    <h:body styleClass="bgLogin">

        <div id="login-dialog">
            <h:form id="frm" prependId="false">
                <p:messages/>                
                <h:panelGrid columns="2" styleClass="grid-login">
                    <p:outputLabel value="Usuário:" />
                    <p:inputText size="30" id="login" value="#{loginBean.username}" />

                    <p:outputLabel value="Senha:" />
                    <p:password size="30" id="senha" value="#{loginBean.password}" />

                    <p:commandButton value="login" action="#{loginBean.logar}" ajax="false" />
                </h:panelGrid>
            </h:form>
        </div>
    </h:body>
</html>

Um detalhe é que esse método do commandButton não é chamado( até ai tudo bem, pois entendi o papel do Spring nessa parte).

Segue a classe configurada que o Spring invoca para login:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UsuarioService usuarioService;

    @Autowired
    private UsuarioPerfilService usuarioPerfilService;

    @Transactional(readOnly = true)
    public UserDetails loadUserByUsername(String username) {
        Usuario usuario = usuarioService.findByNoLogin(username);

        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();

        List<UsuarioPerfil> listaPerfis = usuarioPerfilService.buscarPerfisVinculadosAoUsuario(usuario);

        for (UsuarioPerfil usuarioPerfil : listaPerfis) {
            grantedAuthorities.add(new SimpleGrantedAuthority(usuarioPerfil.getPerfil().getNoPerfil()));
        }
        return new org.springframework.security.core.userdetails.User(usuario.getNoLogin(), usuario.getDsSenha(), grantedAuthorities);
    }
}

Segue também a classe de configuração do SpringSecurity, ainda em fase de ajustes as minhas necessidades:

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();

        http
            .authorizeRequests()
            .and()
            .exceptionHandling()
                .accessDeniedPage("/acesso-negado.xhtml")
            .and()
            .authorizeRequests()
                .antMatchers("")
                .permitAll()
            .and()
            .authorizeRequests()
                .antMatchers("", "")
                .hasRole("ADMINISTRADOR")
                .anyRequest()
                .authenticated()
            .and()
            .logout()
                .logoutSuccessUrl("")
                .permitAll()
            .and()
            .formLogin()
                .loginPage("/pages/login/login.xhtml")
                .usernameParameter("login")
                .passwordParameter("senha")
                .failureUrl("/pages/login/login.xhtml")
                .permitAll();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }
}

Relembrando, o meu problema atual, é como tratar as validações dos campos na tela, assim como as exceções vindas do backend, como erros de autenticação e/ou autorização.

Alguém pode me ajudar?

2 respostas
solução!

opa, essa é uma dúvida que talvez fique um tempo no fórum, é uma integração não coberta pelos treinamentos e ficamos dependendo de alguma com uma experiência mais particular.

De todo jeito, na failureUrl vc pode passar um argumento na url indicando que teve um problema de login.. Lá, vc pode pegar o valor desse parâmetro, carregar no seu managedbean e exibir a mensagem equivalente.

Em relação as mensgages de validação dos inputs eu não entendi.. dado que é o fluxo natural do jsf.

Boa noite Alberto, agradeço a atenção. O failureUrl realmente resolveu.