Conexão no banco com spring security

12 respostas
R

Boa Tarde,

Minha aplicação utiliza a persistencia.xml para conectar ao banco conforme abaixo, porém minha dúvida é, a maioria dos modelos existente na web utilizando spring security conecta para validar o login através do xml do spring conforme modelo B, minha aplicação pode ter essas duas conexão, pelo hibernate e pelo spring ?, usando o hibernate para acesso aos dados da aplicação e a conexão do spring apenas para validar usuário ?.

UTILIZADO NA MINHA APLICAÇÃO.

org.hibernate.ejb.HibernatePersistence








parte da conexão do spring security.xml com opção de conexão do banco de dados.

12 Respostas

L

Eu também gostaria de saber, pois como você está usando o persistence.xml pode usar lá a parte no spring de transaction manager.

Será que pode-se referenciar esse bean ao invés do datasource diretamente ?

R

Pois é, todos exemplos que vejo na web utiliza as tags no arquivo spring security conforme abaixo, será que pode utilizar os dois juntos ?

M

eu uso spring e tenho duas conexoes nunca deu problema. pelo menos comigo.

L

Mas qual tag você usa no

Porque essa tag é para um datasource jdbc, porém o meu datasource está configurado através de um datasource jta configurado no persistence.xml

Tem uma tag que você possa colocar para referenciar o entitymanagerfactory

M
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">

	<http auto-config="true" use-expressions="true">

		<intercept-url pattern="/paginas/**" access="hasRole('ROLE_USER')" />

		<form-login login-page="/login.jsf"
			authentication-failure-url="/login.jsf?erro=true" default-target-url="/paginas/index.jsf" />

	</http>

	<authentication-manager>
		<authentication-provider>
			<jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="SELECT login, senha, 'true' as enable FROM funcionario WHERE login=?"
				authorities-by-username-query="SELECT login, authority FROM funcionario WHERE login=?" />
		</authentication-provider>
	</authentication-manager>
	<beans:bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="url"
			value="jdbc:mysql://localhost:3306/wesley" />
		<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<beans:property name="username" value="root" />
		<beans:property name="password" value="" />
	</beans:bean>

</beans:beans>
R

Minha aplicação esta utilizando as tags para configuração do banco no persistence.xml onde utilizo o hibernate para gerenciar as transações com o banco. e gostaria de configurar o spring para controlar a segurança do meu projeto, porém todos os exemplos que eu acho utiliza a configuração do banco nas do arquivo xml do spring security, minah duvida é se eu posso ter essas duas configurações… veja o meu codigo abaixo.

spring-security-config.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd”>

<form-login login-page="/login.jsp"	
		authentication-failure-url="/login.jsp?login_error=true" default-target-url="/index.jsp" />
</http>

<authentication-provider user-service-ref="customUserService">
	<password-encoder hash="md5" />
</authentication-provider>

<beans:bean id="customUserService" class="br.com.jm.security.CustomUserDetailsService">
	<beans:property name="dataSource" ref="dataSource" />
	<beans:property name="usersByUsernameQuery" value="select login as username, senha as password, ativo as enabled from usuario where login = ?" />
	<beans:property name="authoritiesByUsernameQuery" value="select u.login as username, p.descricao as authority from usuario u join usuario_perfil up on u.login = up.login join perfil p on up.id_perfil = p.id_perfil where u.login = ?" />
</beans:bean>

<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url" value="jdbc:mysql://localhost/ecommerce" />
<beans:property name="username" value="edson" />
<beans:property name="password" value="integrator" />
           
</beans:bean>

<beans:bean class="br.com.jm.security.IncorrectPasswordEventListener">
	<beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean class="org.springframework.security.event.authorization.LoggerListener" />

<beans:bean class="org.springframework.security.event.authentication.LoggerListener" />

</beans:beans>

[applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- Classe responsavel pela gestao das entidades  -->
<bean id="entityManagerFactory"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="ecommerce" />
</bean>


<!-- Identifica os beans anotados com @Service, @Repository, @Controller  -->
<context:component-scan base-package="br.com.integrator.controller" />
    <context:component-scan base-package="br.com.jm.security" />

<!-- Habilita a configuracao de beans via anotacoes
sem a necessidade de usar PersistenceAnnotationBeanPostProcessor,
AutowiredAnnotationBeanPostProcessor e etc
 -->
<context:annotation-config />
<!-- Classe responsavel pela gestao das transacoes  -->
<bean id="transactionManager"
	class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory"
		ref="entityManagerFactory" />
</bean>

<!-- Marcacao de transacoes atraves de anotacoes  -->
<tx:annotation-driven />

<!-- Declaracao de Beans no Spring -->

<bean id="categoriaDao"
	class="br.com.integrator.dao.imp.CategoriaDaoImp" />

CustomUserDetailsService

package br.com.jm.security;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import org.springframework.security.GrantedAuthority;

import org.springframework.security.userdetails.UserDetails;

import org.springframework.security.userdetails.jdbc.JdbcDaoImpl;

public class CustomUserDetailsService extends JdbcDaoImpl {

@Override
protected UserDetails createUserDetails(String username, UserDetails userFromUserQuery,	GrantedAuthority[] combinedAuthorities) {
	Usuario usuario = new Usuario();
	
	usuario.setLogin(userFromUserQuery.getUsername());
	usuario.setSenha(userFromUserQuery.getPassword());
	usuario.setAtivo(userFromUserQuery.isEnabled());
	usuario.setAuthorities(combinedAuthorities);
	
	this.carregarInformacoesAdicionais(usuario);
	
	return usuario;
}

private void carregarInformacoesAdicionais(final Usuario usuario) {
	String sql = "select email, tentativas_login from Usuario where login = ?";
	
	getJdbcTemplate().query(sql, new Object[]{usuario.getUsername()}, new RowMapper() {
		public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
			usuario.setEmail(rs.getString("email"));
			usuario.setTentativasLogin(rs.getInt("tentativas_login"));
			return null;
		}
	});
}

}

L

O michelorth_92.

Como eu disse o seu exemplo usa um datasource configurado pela aplicação.

<jdbc-user-service data-source-ref="dataSource"  
            users-by-username-query="SELECT login, senha, 'true' as enable FROM funcionario WHERE login=?"  
            authorities-by-username-query="SELECT login, authority FROM funcionario WHERE login=?" />

No meu caso eu uso no spring uma referencia ao entity manager, que verifica o persistence.xml e no persistence.xml tem a referencia a um datasource por jndi.

Entendeu ?

R

Concordo, ai esta a questão, não estou conseguindo utilizar o spring security sem referenciar um data source dentro do xml do springsecurity, pois todos exemplos que vejo na internet são deste modelo. Minha aplicação utilizava filtro para controlar acesso administrativo, porém vou ter varias pastas que vão precisar de restrição e para tratar melhor, tenho que implementar o spring security.

Minha aplicação tambem utiliza o Spring que referencia ao entity manager, que verifica o persistence.xml e no persistence.xml tem a referencia a um datasource por jndi, conforme postei meu persistence.xml no primeiro topico acima.

Ai onde entra minha pergunta será que posso ter essas duas formas conexão no banco ?

L

nao tem outra tag nao para referenciar sem ser datasource ?

L

Eu dei uma olhada sobre isso e parece que vai ter que se implementar a consulta referenciando o entitymanager.

Por favor se puder implementar e dar a resposta.

Agradecido

R

publica ai seu spring_security.xml e seu arquivo de autenticação

R

já viu este exemplo ?

utiliza o entityManager para ler as informações do usuário e senha.

Criado 11 de junho de 2012
Ultima resposta 12 de jun. de 2012
Respostas 12
Participantes 3