7
respostas

Duvida aula 4 - Login

Meu css não funciona, a todas as páginas estão bloqueadas, podem me ajudar por favor?

Obs. Quando estou logado o css funciona.

meu loginForm esta dentro de view

loginForm

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Livros de Java, Android, iPhone, Ruby, PHP e muito mais - Casa do Código</title>
<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath}/bootstrap.min.css" />
<link rel="stylesheet" href="${cssPath}/bootstrap-theme.min.css" />
<style type="text/css">
body {
    padding: 60px 0px;
}
</style>
</head>
<body>
    <div class="container">
        <h1>Login Casa do Código</h1>
        <form:form servletRelativeAction="/login" method="post">
            <div class="form-group">
                <label>Nome</label> <input type="text" name="username"
                    class="form-control" />
            </div>
            <div class="form-group">
                <label>Senha</label> <input type="password" name="password"
                    class="form-control" />
            </div>
            <button type="submit" class="btn btn-primary">Logar</button>
        </form:form>
    </div>
</body>
</html>

LoginController

package br.com.casadocodigo.loja.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class LoginController {

    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String loginForm(){
        return "loginForm";
    }

}

SecurityConfiguration extends

package br.com.casadocodigo.loja.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import br.com.casadocodigo.loja.daos.UsuarioDAO;

@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UsuarioDAO usuarioDAO;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers("/produtos/form").hasRole("ADMIN")
        .antMatchers("/carrinho/**").permitAll()
        .antMatchers(HttpMethod.GET, "/produtos").permitAll()
        .antMatchers(HttpMethod.POST, "/produtos").hasRole("ADMIN")
        .antMatchers("/produtos/**").permitAll()
        .antMatchers("/resources/**").permitAll()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated()
        .and().formLogin().loginPage("/login").permitAll()
        .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(usuarioDAO)
        .passwordEncoder(new BCryptPasswordEncoder());
    }
}
7 respostas

Fala Elton, tudo bem ?

Isso acontece porque o Spring Security está barrando as requisições para os seus arquivos css.

É possível fazer com que ele ignore e libere os recursos estáticos sobrescrevendo outro método configure na sua classe SecurityConfiguration:

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

Pronto! Toda requisição para arquivos a partir de /resources está liberada.

Abraço!

Bom dia Rafael,

Infelizmente não de certo, segue a classe como ficou:

Fiz o teste com e sem esse trecho:

  .antMatchers("/resources/**").permitAll()
package br.com.casadocodigo.loja.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import br.com.casadocodigo.loja.daos.UsuarioDAO;

@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UsuarioDAO usuarioDao;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers("/produtos/form").hasRole("ADMIN")
        .antMatchers("/carrinho/**").permitAll()
        .antMatchers(HttpMethod.GET, "/produtos").permitAll()
        .antMatchers(HttpMethod.POST, "/produtos").hasRole("ADMIN")
        .antMatchers("/produtos/**").permitAll()
        .antMatchers("/resources/**").permitAll()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated()
        .and().formLogin().loginPage("/login").permitAll()
        .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(usuarioDao)
            .passwordEncoder(new BCryptPasswordEncoder());
    }

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

Fala Elton, tudo bem ?

Estranho, isso por si só deveria resolver. E não é necessário passar o mesmo matcher no método configure(HttpSecurity), bastaria ignorar no novo método.

Dê uma olhada no DevTools do navegador pra ver o que acontece com as requisições para os arquivos CSS. Qual o status code por exemplo o servidor devolve ?

Boa noite Rafael,

Não tem mensagem de erro, apenas não roda, todas as páginas estão bloqueadas, e como se a classe SecurityConfiguration não estivesse funcionando.

Elton

Opa,

Você poderia compartilhar seu código num repositório (no github, por exemplo), pra poder dar uma olhada ?

Fala Elton, tudo bem ?

Desculpe a demora na resposta. Estava dando uma olhada no código, fiz apenas uma pequena alteração antes de testar, e quando subi a aplicação por aqui funcionou numa boa com os css conforme imagem abaixo.

funcionando

Segue abaixo a alteração:

diff --git a/src/main/java/br/com/casadocodigo/loja/conf/AppWebConfiguration.java b/src/main/java/br/com/casadocodigo/loja/conf/AppWebConfiguration.java
index 810cfc8..29fc1ba 100644
--- a/src/main/java/br/com/casadocodigo/loja/conf/AppWebConfiguration.java
+++ b/src/main/java/br/com/casadocodigo/loja/conf/AppWebConfiguration.java
@@ -34,7 +34,6 @@ import br.com.casadocodigo.loja.daos.ProdutoDAO;
 import br.com.casadocodigo.loja.infra.FileSaver;
 import br.com.casadocodigo.loja.models.CarrinhoCompras;

-@EnableTransactionManagement
 @EnableWebMvc
 @ComponentScan(basePackageClasses = { HomeController.class, ProdutoDAO.class, FileSaver.class, CarrinhoCompras.class })
 @EnableCaching
@@ -53,7 +52,7 @@ public class AppWebConfiguration extends WebMvcConfigurerAdapter {
        @Bean
        public MessageSource messageSource() {
                ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
-               messageSource.setBasename("WEB-INF/messages");
+               messageSource.setBasename("/WEB-INF/message");
                messageSource.setDefaultEncoding("UTF-8");
                messageSource.setCacheSeconds(1);
                return messageSource;
@@ -79,12 +78,6 @@ public class AppWebConfiguration extends WebMvcConfigurerAdapter {
                return new RestTemplate();
        }

-       @Override
-       public void addResourceHandlers(ResourceHandlerRegistry registry) {
-               super.addResourceHandlers(registry);
-               registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
-       }
-
        @Bean
        public CacheManager cacheManager() {
                CacheBuilder<Object, Object> build = CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(5,

Apenas removi o método addResourceHandlers(...), visto que a sobrescrita do método configureDefaultServletHandler()já funciona pra delegar as chamadas dos estáticos para o Tomcat. Além disso removi o matcher dos recursos do método configure(HttpSecurity http), já que está sendo ignorada pelo security qualquer requisição para /resources/**

diff --git a/src/main/java/br/com/casadocodigo/loja/conf/SecurityConfiguration.java b/src/main/java/br/com/casadocodigo/loja/conf/SecurityConfiguration.java
index 3625ab2..2398e65 100644
--- a/src/main/java/br/com/casadocodigo/loja/conf/SecurityConfiguration.java
+++ b/src/main/java/br/com/casadocodigo/loja/conf/SecurityConfiguration.java
@@ -23,14 +23,19 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
            http.authorizeRequests()
            .antMatchers("/produtos/form").hasRole("ADMIN")
            .antMatchers("/carrinho/**").permitAll()
-           .antMatchers(HttpMethod.GET, "/produtos").permitAll()
            .antMatchers(HttpMethod.POST, "/produtos").hasRole("ADMIN")
            .antMatchers("/produtos/**").permitAll()
-           .antMatchers("/resources/**").permitAll()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated()
-           .and().formLogin().loginPage("/login").permitAll()
-           .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
+           
+           .and()
+           .formLogin().loginPage("/login")
+           .defaultSuccessUrl("/produtos")
+           .permitAll()
+           
+           .and()
+           .logout()
+           .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
        }

Faça esse ajustes e deve funcionar.

Dica extra (rs): Tome cuidado na sua lista JSP, se um usuário não estiver logado ela joga exception por tentar acessar propriedades de usuário. Use <security:authorize>pra garantir que a página só vai renderizar o trecho se houver usuário autenticado.

diff --git a/src/main/webapp/WEB-INF/views/produtos/lista.jsp b/src/main/webapp/WEB-INF/views/produtos/lista.jsp
index 01ee5ad..836ad80 100644
--- a/src/main/webapp/WEB-INF/views/produtos/lista.jsp
+++ b/src/main/webapp/WEB-INF/views/produtos/lista.jsp
@@ -42,8 +42,10 @@
                        </ul>
                        <ul class="nav navbar-nav navbar-right">
                                <li><a href="#">
-                                       <security:authentication property="principal" var="usuario"/>
-                                       Usu<E1>rio: ${usuario.username }
+                                       <security:authorize access="isAuthenticated()">
+                                               <security:authentication property="principal" var="usuario"/>
+                                               Usu<E1>rio: ${usuario.username }
+                                       </security:authorize>
                                </a>></li>
                        </ul>
                </div>

Uma outra coisa que percebi quando importei o projeto é que tinha arquivos css constando no classpath como libs da sua aplicação, o que ocasionou um pequeno probleminha de build. Remova esses arquivos do build path e creio que você não terá mais nenhum problema.

Espero ter ajudado. Abraço e bons estudos!