Estou trabalhando em uma aplicação usando jee6 com jboss as 7. REsolvi implementar a segurança usando spring security, pois não quero fazer isso no container.
Estou usando JNDI. Nas hora fazer o login ele não executa a query.
Persistence xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="campus" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/campus</jta-data-source>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.hbm2ddl.auto" value="update"></property>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</properties>
</persistence-unit>
</persistence>
Managed bean
package br.com.ebeji.campus.interfaces.controllers;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import br.com.ebeji.campus.application.services.AuthenticationService;
@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 "/auth/login.xhtml";
}
System.out.println("porra");
return "/seguranca/usuarios/list.xhtml";
}
public String logout() {
authenticationService.logout();
return "/auth/login.xhtml";
}
public String getUsuarioLogado(){
return authenticationService.getUsuarioLogado().getUsername();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setAuthenticationService(AuthenticationService authenticationService) {
this.authenticationService = authenticationService;
}
}
Configuração de banco de dados no spring
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd"
default-autowire="byName">
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
</bean>
</property>
</bean>
<jee:jndi-lookup id="dataSource" jndi-name="java:/campus"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<tx:jta-transaction-manager />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
</beans>
Classe que faz a autenticação:
package br.com.ebeji.campus.application.services;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import br.com.ebeji.campus.domain.model.Usuario;
@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) {}
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();
}
}
Classe que implementa UserDetailsService
package br.com.ebeji.campus.application.services;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import br.com.ebeji.campus.domain.model.Usuario;
@Component("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
@PersistenceContext
private EntityManager entityManager;
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
return findByUsername(username);
}
private Usuario findByUsername(String username) {
try {
Query query = this.entityManager.createQuery(
"SELECT u FROM Usuario as u WHERE u.email = :username")
.setParameter("username", username);
System.out.println("oba");
return (Usuario) query.getSingleResult();
} catch (NoResultException e) {
throw new UsernameNotFoundException("Usuario nao encontrado");
}
}
}
No console ao carregar a aplicação:
.
.
.
19:13:21,039 INFO [org.springframework.transaction.jta.JtaTransactionManager] (MSC service thread 1-1) Using JTA UserTransaction: Transaction: unknown
19:13:21,040 AVISO [org.springframework.transaction.jta.JtaTransactionManager] (MSC service thread 1-1) No JTA TransactionManager found: transaction suspension not available
19:13:21,040 INFO [org.springframework.transaction.jta.JtaTransactionManager] (MSC service thread 1-1) Using JTA TransactionSynchronizationRegistry: com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple@1d509e3
.
.
.
Percebi que o problema é que ele não executa a query em findByUsername() na classe UserDetailsServiceImpl. Pode ser algum problema na conexão? Alguém já teve esse problema?