5
respostas

Erro Spring Security

Bom dia!

Estou fazendo alguns testes com Spring Security, mas ele não está encriptografando as senhas, nem reconhece se usuário está autenticado. Na jsp, nas opções do cabeçalho, só aparece a opção de Login, e quando eu faço login, não muda a opção para Logou, nem consigo acessar o mapeamento "historico".

O que pode ser?

SecurityConfiguration

    @EnableWebSecurity
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private UsuarioDAO usuarioDao;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(usuarioDao).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()
                    .loginPage("/cadastro/form-login")
                    .permitAll()
            .and()
                .logout().permitAll()
            .and()
                .exceptionHandling().accessDeniedPage("/errors/403")
            .and()
                .rememberMe().userDetailsService(userDetailsService);
    }

Login Controller

    @RequestMapping("efetuaLogin")
    public String efetuaLogin(Usuario usuario, HttpSession session) {

        System.out.println("Acessando Login");

        boolean existeUsuario = usuarioDao.loadUserByUsername(usuario.getEmail()) != null;

        if (existeUsuario) {
            session.setAttribute("usuarioLogado", usuario);
            System.out.println("Usuário logado: " + session.getId());
            return "redirect:home";
        } else {
            System.out.println("Usuário não existe");
            return "cadastro/form-login";
        }

UsuarioDao

@Repository
public class UsuarioDAO 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 UserDetails loadUserByUsername(String email) {
        System.out.println("loadUserByUsername");
        List<Usuario> usuarios = manager.createQuery("select u from Usuario u where email = :email", Usuario.class)
                .setParameter("email", email)
                .getResultList();

        if(usuarios.isEmpty()) {
            System.out.println("Usuario " + email + " não foi encontrado");
            return null;
        }

        return usuarios.get(0);
    }

cabecalho.jsp

<header>

    <ul>
        <li><a href="${contextPath}home">Início</a></li>
        <li><a href="${contextPath}blog">Blog</a></li>

        <security:authorize access="hasRole('ROLE_USUAR')">
            <li><a href="${contextPath}historico">Meu Histórico</a></li>
        </security:authorize>
    </ul>

    <security:authorize access="!isAuthenticated()">
        <ul>
            <li><a href="${contextPath}loginForm">Login</a></li>
        </ul>
    </security:authorize>

    <security:authorize access="isAuthenticated()">
        <ul>
            <li><a href="${contextPath}logout">Sair</a></li>
        </ul>
    </security:authorize>

</header>
5 respostas

Olá Rafael, tudo bem? Peço desculpas pela demora no retorno! Mas a lógica de login, de como autenticar o usuário já está implementada pelo próprio spring, e precisamos apenas fazer um post para a URL /login e como você não postou aqui o código da sua página de login eu não entendi muito bem como isso está funcionando, então você poderia disponibilizar o conteúdo aqui pra gente poder verificar e tentar ti ajudar!

Jonilson, boa noite!

Muito obrigado pelo retorno!

Segue os códigos:

form-login.jsp

<jsp:body>    

        <main>

            <div class="container">    

                <section class="login">

                    <h2 class="titulo--principal--secao">Login</h2>

                    <form:form class="formLogin" action="${contextPath}efetuaLogin" method="post">
                        <div>
                            <label for="email">E-mail: </label>
                            <input class="entradaDados" type="email" name="email">
                        </div>
                        <div>
                            <label for="senha">Senha: </label>
                            <input class="entradaDados" type="password" name="senha">
                        </div>
                        <div class="formCheck">
                            <input type="checkbox" id="remember-me" name="remember-me">
                            <label for="remember-me">Lembrar-me</label>
                        </div>
                        <input class="botao" type="submit" value="Acessar cadastro">
                    </form:form>

                    <p class="referencia">Caso não seja cadastrado, 
                        <a href="${contextPath}cadastroUsuario">clique aqui</a>            
                    </p>

                </section>

            </div>

        </main>

    </jsp:body>

Tela de cadastro: meus-dados.jsp

<jsp:body>

        <div class="container">

            <h2 class="titulo--principal__secao">Alteração do Cadastro</h2>

            <section class="alteracaoCadastral">
                <form:form id="alteraCadastro" class="formAltCadastro" action="${contextPath}alteraCadastro" method="post">
                    <div>
                        <label for="nome"><strong>Nome:</strong> </label>
                        <input type="text" name="nome" value="${pessoa.nome}"/>
                    </div>
                    <div>
                        <label for="altura"><strong>Altura:</strong> </label>
                        <input type="text" name="altura" value="${pessoa.altura}"/>
                    </div>
                    <div>
                        <label for="dataNascimentoAnterior"><strong>Data de Nascimento Informada:</strong> </label>
                        <input type="text" name="dataNascimentoAnterior" value="<fmt:formatDate value="${pessoa.dataNascimento.time}" pattern="dd/MM/yyyy" />" readonly/>
                    </div>
                    <div>
                        <label for="dataNascimento"><strong>Data Nascimento:</strong> </label>
                        <input name="dataNascimento" id="dataNascimento" type="date">
                    </div>
                    <div>
                        <fieldset>
                            <legend><strong>Sexo: </strong></legend>
                            <select id="sexo" name="sexo" onchange="habilitaBotao()" >
                                <option selected disabled>Selecione...</option>
                                <option value="Masculino">Masculino</option>
                                <option value="Feminino">Feminino</option> 
                            </select>
                        </fieldset>
                    </div>
                    <div>
                        <label for="email"><strong>Email:</strong> </label>
                        <input type="text" name="email" value="${pessoa.usuario.email}" onblur="checarEmail()" />
                    </div>
                    <div>
                        <label for="senha"><strong>Nova Senha:</strong> </label>
                        <input type="password" name="senha" />
                    </div>
                    <div>
                        <label for="csenha"><strong>Confirmar Nova Senha:</strong> </label>
                        <input type="password" name="csenha" onblur="checarSenha()"/>
                    </div>

                    <input type="hidden" name="idPessoa" value="${pessoa.id}" />
                    <input type="hidden" name="idUsuario" value="${usuario.id}" />
                    <input type="submit" class="botao" id="avancar" disabled="disabled" value="Alterar Dados" />
<!--                     <button type="button" id="avancar" class="botao" name="button">Alterar Dados</button> -->
                </form:form>
            </section>

            <section class="voltarAlteracaoCadastro">

                <form:form action="${contextPath}voltarCadastro" method="post">
                    <input type="submit" class="botao" value="Voltar" />
<!--                     <button type="button" class="botao" name="button">Voltar </button> -->
                </form:form>

            </section>

        </div>

    </jsp:body>

Nesse caso você está tentando criar sua própria implementação de login, é isso?

Bem, ainda tenho alguma perguntas:

  • 1 - Sua classe LoginController está com a anotação @session?
  • 2 - A requisição quando você faz o post na página de Login para a URI efetuaLogin funciona corretmente? Ele loga no console do Eclipse como está nessa linha:
    System.out.println("Acessando Login");
    No caso ele logo no console do Eclipse a mensagem "Acessando Login" corretamente? Pergunto isso porque para acessar essa Url pelo login você teria que adicionar:
    .loginProcessingUrl("/perform_login")
    No método configure da classe SecurityConfiguration.

E penso que você precisa realmente autenticar o usuário de alguma forma, nesse link tem uma exemplo disso, porque da forma que está atualmente você está apenas adicionando o usuário na sessão e não fazendo a autenticação dele para requisição subsequentes.

Jonilson,

Eu troquei o HD da minha máquina, não estou com o ambiente montado. Vou configurar tudo e rodar e verificar esses pontos que você me indicou, ai eu retorno...

Certo, sem problemas!