Pessoal, boa tarde!
Estou começando com Spring Security, e cheguei num ponto em que não sei o que estou fazendo errado, mas não funcionando como deveria.
Eu criei uma página de login, não quis usar a do Spring, mas não consigo direcionar os dados da minha página para o Spring validar. E quando salvo um usuário a senha não está sendo criptografada.
Podem me ajudar?
form-login.jsp
<jsp:body>
<h1>Login</h1>
<form:form action="login" method="post">
<div>
<label for="email">E-mail: </label>
<input type="text" name="email" />
</div>
<div>
<label for="senha">Senha: </label>
<input type="password" name="senha" />
</div>
<div>
<input type="checkbox" id="remember-me" name="remember-me" />
<label for="remember-me">Lembrar-me</label>
</div>
<input type="submit" value="Acessar cadastro" />
</form:form>
<br />
<p>Caso não seja cadastrado, <a href="${contextPath}cadastroUsuario">clique aqui</a>
</p>
loginDAO
@Repository
public class LoginDAO implements UserDetailsService {
@PersistenceContext
private EntityManager manager;
public void save(Usuario usuario) {
manager.persist(usuario);
}
public Usuario findOne(Integer id) {
return manager.find(Usuario.class, id);
}
@Override
public Usuario loadUserByUsername(String email) {
List<Usuario> usuarios = manager.createQuery("select u from Usuario u where email = :email", Usuario.class)
.setParameter("email", email)
.getResultList();
if(usuarios.isEmpty()) {
throw new UsernameNotFoundException("Usuario " + email + " não foi encontrado");
}
return usuarios.get(0);
}
LoginController
@Controller
public class LoginController {
@Autowired
private LoginDAO loginDao;
@RequestMapping(value = { "loginForm", "login", "cadastro/form-login"}, method = RequestMethod.GET)
public String loginForm() {
System.out.println("Acessando Login");
return "cadastro/form-login";
}
@RequestMapping("logout")
public String logout(HttpSession session) {
System.out.println("Efetuando logout");
session.invalidate();
return "redirect:home";
}
SecurityConfiguration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private LoginDAO loginDao;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(loginDao).passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/controle/**").hasRole("USUAR")
.antMatchers("/historico").hasRole("USUAR")
.antMatchers("/blog").hasRole("USUAR")
.antMatchers("/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.usernameParameter("email")
.passwordParameter("senha")
.loginPage("/cadastro/form-login")
.permitAll()
.and()
.logout().permitAll()
.and()
.exceptionHandling().accessDeniedPage("/errors/403")
.and()
.rememberMe().userDetailsService(userDetailsService);
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**");
}
Classe Usuário
@Entity
public class Usuario implements UserDetails {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Email
@NotNull
@NotEmpty
private String email;
@Size(min = 6)
@NotNull
@NotEmpty
private String senha;
@ManyToMany
@JoinTable(name = "usuario_role", joinColumns = @JoinColumn(name = "usuario_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "nome"))
private List<Role> roles;
@DateTimeFormat
@NotNull
private Calendar dataCadastro = Calendar.getInstance();
private boolean cadastroAtivado = false;
A criação de Usuários está no UsuarioController, onde não está sendo criptogrado a senha.
@Controller
public class UsuarioController {
@Autowired
private LoginDAO loginDao;
@RequestMapping("cadastroUsuario")
public String cadastraUsuario() {
System.out.println("Acessando menu de cadastro: ");
return "cadastro/form-usuario";
}
@RequestMapping("enviaCadastro")
@Transactional
public String enviaCadastro(@Valid Usuario usuario, BindingResult result, Model model) {
System.out.println("enviaCadastro");
usuario.setRoles(Arrays.asList(new Role("ROLE_USUAR"), new Role("ROLE_ADMIN")));
if (result.hasErrors()) {
System.out.println("Erro");
return "cadastro/form-usuario";
}
loginDao.save(usuario);
model.addAttribute("idFormUsuario", usuario.getId());
return "cadastro/form-pessoa";
}