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?