Spring Security + JSF2 nao consigo fazer a injeção

1 resposta
furacao123

Estou tentando desenvolver uma area de login com SpringSecurity 3 mas estou com duvidas na hora de injetar o managed bean, axei um exemplo

@Component
public class AuthenticationService {

    @Autowired
    @Qualifier("authenticationManager")
    private AuthenticationManager authenticationManager;

    public boolean login(String username, String password) {
        try {
            UsernamePasswordAuthenticationToken token =
                    new UsernamePasswordAuthenticationToken(username, password);
            Authentication authenticate = authenticationManager.authenticate(token);
            if (authenticate.isAuthenticated()) {
                SecurityContextHolder.getContext().
                        setAuthentication(authenticate);
                return true;
            }
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }
        return false;
    }

    public void logout() {
        SecurityContextHolder.getContext().setAuthentication(null);
        invalidateSession();
    }

    public Usuario getUsuarioLogado() {
        return (Usuario) SecurityContextHolder.getContext().
                getAuthentication().getPrincipal();
    }

    private void invalidateSession() {
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
        session.invalidate();
    }
@Component("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

    @PersistenceContext
    private EntityManager entityManager;

    private Usuario findByUsername(String username) {
        try {
            return (Usuario) entityManager.createNamedQuery("Usuario.findByUsername").setParameter("username", username).getSingleResult();

        } catch (NoResultException e) {
            throw new UsernameNotFoundException("Usuario nao encontrado");
        }
    }

    public UserDetails loadUserByUsername(String string) throws UsernameNotFoundException, DataAccessException {
        return findByUsername(string);
    }
}
public class Usuario implements Serializable, UserDetails {

  private static final long serialVersionUID = -8451679170281063697L;

    private Long id;
  
  @NotNull
  private String username;

  @NotNull
  private String password;

    private List<Role> roles;
@ManagedBean
@RequestScoped
public class LoginBean {

    @ManagedProperty(value = "#{authenticationService}")
    private AuthenticationService authenticationService;
    private String userName;
    private String password;

    public String login() {
        boolean success = authenticationService.login(userName, password);

        if (!success) {
            FacesMessage facesMessage =
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "",
                    "Login ou senha inválidos");
                FacesContext.getCurrentInstance().
                    addMessage(null, facesMessage);
            return "falhaLogin";
        }

        return "sucessoLogin";
    }

    public String logout() {
        authenticationService.logout();
        return "login";
    }
}
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui">

    <h:head>
        <title>Spring Security + JSF + JPA</title>
        <meta http-equiv="content-type" content="text/xhtml; charset=UTF-8" />
        <link href="style/default.css" type="text/css" rel="stylesheet" />
    </h:head>

    <body >
        <h:form prependId="false" >

            <p:growl id="growlMessage" showDetail="true" />

            <p:panel header="Entre com o seu login e senha" 
                     style="width: 250px;margin: auto;"> 

                <h:panelGrid columns="3" >

                    <h:outputLabel for="userName" value="Username: " />
                    <p:inputText id="userName" value="#{loginBean.userName}" />
                    <h:message  for="userName" errorClass="error"/>

                    <h:outputLabel for="password" value="Password: " />
                    <p:password id="password" value="#{loginBean.password}" minLength="2"
                                feedback="false" />
                    <h:message for="password" errorClass="error"/>

                    <h:outputText value="" />
                    <p:commandButton type="submit" id="login" 
                                     action="#{loginBean.login}" value="Ok" 
                                     update="growlMessage" />
                </h:panelGrid>

            </p:panel> 
        </h:form>
    </body>
</html>

ao executar esta dando o seguinte problema

SEVERE: Error Rendering View[/login.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Não foi possível criar o bean gerenciado loginBean.  Os seguintes problemas foram encontrados:
     - A propriedade authenticationService para o bean gerenciado loginBean não existe.
	at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:265)
	at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
	at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)

O que estou fazendo de errado, ou tem uma maneira melhor de fazer esse controle de usuario pelo SpringSecurity?

Obrigado

1 Resposta

vinnymesquita

Amigo estou com o mesmo problema.
Conseguiu acha a solução?
Abraços.

Criado 27 de setembro de 2011
Ultima resposta 26 de out. de 2013
Respostas 1
Participantes 2