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

Dúvida no Ex. 2 da Aula 4 - Personalizando o login e logout

Após adicionar os recursos do security o spring não reconheçe mais meus recursos e fica dando erro 404 para todas paginas:

package br.com.preconizado.conf;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {

        return new Class[] {SecurityConfiguration.class};// SecurityConfiguration.class
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {

        return new Class[] { AppWebConfiguration.class, JPAConfiguration.class };
    }

    @Override
    protected String[] getServletMappings() {

        return new String[] { "/" };
    }

}

package br.com.preconizado.conf;

import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableWebMvcSecurity
public class SecurityConfiguration extends WebMvcConfigurerAdapter {

}

package br.com.preconizado.conf;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringSecurityFilterConfiguration extends AbstractSecurityWebApplicationInitializer{

}
17 respostas

Oi Diego, tudo bem? há alguma mensagem de erro impressa no console? Pode colar aqui por favor?

Uma observação a ser feita é que ao adicionar o Spring Security neste projeto, algumas configurações precisaram do uso do banco de dados, então voce pode ter um erro por que as configurações de segurança estão subindo antes das de banco de dados.

Pra solucionar, você deve por todas as classes de configurações para subir no rootConfigClasses desta forma:

public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {

        return new Class[] {SecurityConfiguration.class,  AppWebConfiguration.class, JPAConfiguration.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {

        return new Class[] { };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

Oi Diego, na hora que vc sobe o servidor não está dando nenhum erro? Nenhuma mensagem que indica alguma coisa? Uma coisa que pode ta dando errado é que a configuração do AppConfiguration e da JPAConfiguration está ocorrendo depois da do Security... Tenta jogar todas para o método getConfigRootClasses?

Wanderson respondeu na mesma hora :).

deixei assim como Wanderson recomendou :

    @Override
    protected Class<?>[] getRootConfigClasses() {

        return new Class[] { SecurityConfiguration.class, JPAConfiguration.class, AppWebConfiguration.class };// SecurityConfiguration.class
    }

e está dando esse erro no console

GRAVE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.servlet.Filter org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain() throws java.lang.Exception] threw exception; nested exception is java.lang.IllegalStateException: At least one non-null instance of WebSecurityConfigurer must be exposed as a @Bean when using @EnableWebSecurity. Hint try extending WebSecurityConfigurerAdapter
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:597)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5097)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5615)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.servlet.Filter org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain() throws java.lang.Exception] threw exception; nested exception is java.lang.IllegalStateException: At least one non-null instance of WebSecurityConfigurer must be exposed as a @Bean when using @EnableWebSecurity. Hint try extending WebSecurityConfigurerAdapter
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586)
    ... 23 more
Caused by: java.lang.IllegalStateException: At least one non-null instance of WebSecurityConfigurer must be exposed as a @Bean when using @EnableWebSecurity. Hint try extending WebSecurityConfigurerAdapter
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:90)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$af81519a.CGLIB$springSecurityFilterChain$4(<generated>)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$af81519a$$FastClassBySpringCGLIB$$a1101ded.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$af81519a.springSecurityFilterChain(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    ... 24 more

o erro do configureAdapter consegui resolver mas os outros dois continuam.

a unica diferenca que notei e que a versao de umas das dependencias é diferente do restante, tem algum problema ser assim?

<dependency> -->
<!--             <groupId>org.springframework.security</groupId> -->
<!--             <artifactId>spring-security-config</artifactId> -->
<!--             <version>4.0.0.M2</version> -->
<!--         </dependency> -->

<!--         <dependency> -->
<!--             <groupId>org.springframework.security</groupId> -->
<!--             <artifactId>spring-security-taglibs</artifactId> -->
<!--             <version>4.0.0.M2</version> -->
<!--         </dependency> -->

<!--         <dependency> -->
<!--             <groupId>org.springframework.security</groupId> -->
<!--             <artifactId>spring-security-web</artifactId> -->
<!--             <version>4.1.1.RELEASE</version> -->
<!--         </dependency> -->

<!--         <dependency> -->
<!--             <groupId>org.springframework.security</groupId> -->
<!--             <artifactId>spring-security-core</artifactId> -->
<!--             <version>4.0.0.M2</version> -->
<!--         </dependency> -->

Opa, qual erro que continua, o dos 404? Não está mais dando mais nenhuma exception no log? Manda também a implementação da sua classe anotada com @@EnableWebSecurity ?

Diego, durante o progresso do curso algumas bibliotecas foram atualizadas e por algum motivo que desconheço elas conflitaram de alguma forma e deixaram de funcionar. Isso na versão usada no curso e com as versões mais recentes também houveram problemas, contudo, conseguimos resolver usando a versão RELEASE da MISLESTONE usada no curso.

Se não me engano a versão correta é essa:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>

Experimente fazer isso e atualizar o projeto. Algumas anotações vão aparecer como depreciadas, mas funcionam =)

Faça o teste e nos avise caso tenha problemas ainda.

chegando em casa vou baixar e tentar com essas dependencias, qualquer coisa eu aviso, Obrigado!

alberto a classe está assim:

//package br.com.preconizado.conf;
//
//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
//import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
//
//@EnableWebMvcSecurity
//public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
//
//}

e o erro :

GRAVE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: org/springframework/web/cors/CorsProcessor
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getDeclaredMethods(Unknown Source)
    at org.springframework.core.type.StandardAnnotationMetadata.hasAnnotatedMethods(StandardAnnotationMetadata.java:129)
    at org.springframework.context.annotation.ConfigurationClassUtils.isLiteConfigurationCandidate(ConfigurationClassUtils.java:150)
    at org.springframework.context.annotation.ConfigurationClassUtils.isConfigurationCandidate(ConfigurationClassUtils.java:118)
    at org.springframework.context.annotation.ConfigurationClassParser.processMemberClasses(ConfigurationClassParser.java:304)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:238)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:221)
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:435)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:264)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:221)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:155)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:312)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:244)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5097)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5615)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.springframework.web.cors.CorsProcessor
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1891)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1734)
    ... 32 more

O problema de ClassNotFoundException ta bem relacionado com o fato de atualização das libs.. Se for atualizar alguma, provavelmente vai ter que ir atualizando outras. Em relação a sua classe, ainda falta o método que vc configura a segurança em si? Chegou a ir mais para frente no curso?

Alberto eu ia começar a colocar as permissões mas como deu esse erro não tem como prosseguir.

Adiciona a annotation EnableWebSecurity em cima da classe? Você colocou apenas a EnableWebSecurity

Bom dia pessoal. Ontem eu apaguei as dependencias do meu projeto e baixei de novo, fazendo com a videoaula e deu certo, só tem algo que não estou entendendo. quando tento acessar alguma pagina sem logar ele direciona para o login ate ai tudo certo, mas depois que logo no sistema ele me direciona para a ultima pagina que tentei acessar, como posso escolher uma pagina sempre q o usuario logar tipo home por ex?

Opa Diego,

Você pode fazer algo assim:

security.formLogin().loginProcessingUrl("/login").loginPage("/")
                .defaultSuccessUrl("/suaUrlPosLogin")

alterei mas não mudou nada ela continua redirecionando para ultima pagina que acessei, se dou logout ela vai para page de login, e quando logo ela fica login?logout, ou se entro em lista e logo em seguida ela redireciona na lista

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/departamento/lista").hasRole("ADMIN").antMatchers("/usuario/cadastro")
                .hasRole("ADMIN").antMatchers("/").permitAll().antMatchers("/usuario/bemVindo").permitAll()
                // .antMatchers("/departamento/cadastro").hasRole("ADMIN")
                // .antMatchers(HttpMethod.POST,
                // "/departamento").hasRole("ADMIN")
                // .antMatchers(HttpMethod.GET,
                // "/departamento").hasRole("ADMIN")
                .antMatchers("/resources/**").permitAll()
                // .antMatchers("/departamento/**").permitAll()            
                .anyRequest().authenticated().and().formLogin().loginProcessingUrl("/login").loginPage("/login").defaultSuccessUrl("/").permitAll()
                .and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
solução!

Oi Diego, estava olhando a documentação e se vc tiver tentado acessar uma página segura antes, ele vai te levar para essa, mesmo com defaultSuccessHandler. Talvez tenha uma forma mais simples, mas o jeito que eu resolvi foi esse aqui:

                    .anyRequest().authenticated().and().formLogin().loginPage("/login").successHandler(new CustomSuccessLoginHandler()) ....
public class CustomSuccessLoginHandler implements AuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {
            response.sendRedirect("/contexto/urlQueVcQuer");
    }
}

Acho que desse jeito vai ficar fixo para a url que vc quer.

Perfeito Alberto muito obrigado