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

Autenticando usuario Spring Security

Boa Tarde! Estou testando fazer com que um usuario ao logar em browser diferentes se ele ja estiver logado no sistema, ele vai ser redirecionado para a home, tentei de varias maneiras mas estou deixando passar algo poderiam me ajudar? estou debugando mas ela não esta nem passando pelo metodo.

metodo da controler

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public ModelAndView logado(Principal principal, RedirectAttributes redirectAttributes) {

        List<Usuario> emailBd = usuarioDAO.find();

        for (Usuario usuario : emailBd) {

            if (principal.getName().equals(usuario.getEmail())) {

                redirectAttributes.addFlashAttribute("sim", "Ja esta Logado");
                return new ModelAndView("redirect:/");
            }

        }
        redirectAttributes.addFlashAttribute("nao", "Não esta Logado");
        return new ModelAndView("redirect:/loginForm");
    }
}

a jsp

<body>


    <div class="container-fluid text-left">
        <div class="row">
            <div class="col-sm-4 sidenav"
                style="background: #99c2ff; height: 100%">
                <!--                 <div class="list-group">lateral esquerdo</div> -->
            </div>


            <div class="col-sm-4"
                style="margin-top: 80px; border: solid 1px #000000; border-radius: 10px">
                <h1>Login</h1>

                <form:form action="/Preconizado/login" method="post">
                    <%--                     <security:authorize access="isAuthenticated()"> --%>
                    <div class="form-group">
                        <label>Email</label> <input name="username" type="text"
                            class="form-control" placeholder="Digite o e-mail" />
                    </div>
                    <div class="form-group">
                        <label>Senha</label> <input type="password" name="password"
                            class="form-control" placeholder="Digite a senha">
                    </div>
                    <button type="submit" class="btn btn-success">Logar</button>
                    <%--                     </security:authorize> --%>
                </form:form>

            </div>

            <div class="col-sm-4 sidenav"
                style="background: #99c2ff; height: 100%"></div>
        </div>
    </div>
</body>
11 respostas

Oi Diego, você precisa guardar cada usuário que se loga em algum lugar, para poder comparar depois.. A sessão de um navegador não é compartilhada com outro. Você pode guardar em algum objeto que está no escopo de aplicação.

pensei em criar um campo no bd para guardar essa informação mas acho q pode ficar pesada, pois vou ter que ficar comparando sempre que alguem entrar, tem algum exemplo de como posso fazer isso Alberto?

Oi Diego,

Não tenho nenhum exemplo pronto. Eu cria uma classe mais ou menos assim:

@Component
public class UsuariosLogados  {
  private Set<Usuario> usuarios = new HashSet<>();

  public boolean add(Usuario usuario){
      return usuarios.add(usuario);
  }

  public boolean remove(Usuario usuario){
     return usuarios.remove(usuario);
  }
}

Sempre que alguém se logar eu chamo esse método.. Se retornar false, quer dizer que já logado. Lembre de remover também...

Alberto boa tarde tudo bom? então fiz um metodo seguindo como disse o problema é que agora após o login ele entra na pagina home mas não está autenticando, e nem gravando o usuario no HashSet., pois toda vez que eu logo peço para imprimir e sempre esta vazio o array, so tem valor após o add, metodo está assim.

@RequestMapping(value = "/", method = RequestMethod.POST)
    public ModelAndView validaUser(Principal logado, Usuario usuario, UsuariosLogados usuariosLogados,
            RedirectAttributes redirectAttributes) {

        if (usuario.getEmail() == null) {
            System.out.println("Vazio");

            System.out.println(usuariosLogados);
            ModelAndView modelAndView = new ModelAndView("/login");
            return modelAndView;

            // return new ModelAndView("redirect:/login");
        } else {
            if (logado == null) {
                System.out.println(usuariosLogados);
                // usuariosLogados.compara(usuario);
                usuariosLogados.add(usuario);
                System.out.println(usuariosLogados);
                ModelAndView modelAndView = new ModelAndView("/home");
                // return modelAndView;
                return new ModelAndView("redirect:/bemVindo");

            } else {
                usuariosLogados.remove(usuario);
                ModelAndView modelAndView = new ModelAndView("/login");
                return modelAndView;
            }

        }

    }

Pede o UsuariosLogado como dependência da classe, com @Autowired(chute).

coloquei e ficou assim a classe mas agora ta retornando que não consegue injetar

@Autowired
    public UsuariosLogados logados;

    @RequestMapping("/")
    public ModelAndView index() {
        ModelAndView modelAndView = new ModelAndView("/home");
        return modelAndView;
    }

    @RequestMapping(value = "/", method = RequestMethod.POST)
    public ModelAndView validaUser(Principal logado, Usuario usuario, RedirectAttributes redirectAttributes) {

        if (usuario.getEmail() == null) {
            System.out.println("Vazio");

            System.out.println(logados);
            ModelAndView mod = new ModelAndView("/login");
            return mod;

            // return new ModelAndView("redirect:/login");
        } else {
            if (logado == null) {
                System.out.println(logados);
                // usuariosLogados.compara(usuario);

                logados.adicionar(usuario);
                System.out.println(logados);
                // usuariosLogados.remover(usuario);
                // ModelAndView AndView = new ModelAndView("/home");
                // return modelAndView;
                redirectAttributes.addFlashAttribute("sim", "está logado");
                return new ModelAndView("redirect:/home");

            } else {
                logados.remover(usuario);
                redirectAttributes.addFlashAttribute("logou", "Logou");
                ModelAndView model = new ModelAndView("/login");
                return model;
            }

        }

    }



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 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public br.com.preconizado.models.UsuariosLogados br.com.preconizado.controllers.HomeController.logados; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.preconizado.models.UsuariosLogados] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:326)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    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.BeanCreationException: Could not autowire field: public br.com.preconizado.models.UsuariosLogados br.com.preconizado.controllers.HomeController.logados; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.preconizado.models.UsuariosLogados] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:542)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:323)
    ... 22 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.preconizado.models.UsuariosLogados] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1261)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1009)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
    ... 24 more

Oi Diego,

Você colocou @Component em cima da declaração da classe UsuariosLogado?

Abraço!

Sim joviane essa anotação ja estava na classe mas mesmo assim não funcionou

A exception não deixa dúvidas, o Spring não está achando sua classe. Ela está num pacote que está sendo scaneado? Com certeza ela está sendo compilada e jogada para o tomcat?

sim está no mesmo pacote de models que o restante das classes, agora como vejo se está sendo jogada para o tomcat?

solução!

vou tentar fazer de outra maneira obrigado pela ajuda