Spring Brasil User Group

Fortalecendo a comunidade Spring no Brasil

Não consigo autenticar o usuario usando o spring security com firebird.

<http auto-config='true' >
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
        <form-login
            login-page="/publica/logarSistema.jsf"
            login-processing-url="/publica/j_spring_security_check"  
            authentication-failure-url="/publica/acessoNegado.jsf?auth_failure=true"/>
               
    </http>
       
    <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <beans:property name="url" value="jdbc:firebirdsql:localhost:C://painel/painel.fdb" />
        <beans:property name="driverClassName" value="org.firebirdsql.jdbc.FBDriver" />
        <beans:property name="username" value="SYSDBA" />
        <beans:property name="password" value="masterkey" />
    </beans:bean>
   
    <authentication-manager>
        <authentication-provider>

                <jdbc-user-service data-source-ref="dataSource"
                               
                users-by-username-query="SELECT login as username, senha as password, 1 as enabled  FROM usuarios WHERE username=lower(?)"  
                authorities-by-username-query="SELECT login as username, permissao as authorities FROM usuarios WHERE username=?"
            />
           
        </authentication-provider>
    </authentication-manager>
   
</beans:beans>                              

 

os campos do banco possuem a mesma nomenclatura que o spring exige.

o firebird não aceita boolean e password.

os campos do banco são: login, senha e permissao.

Já fiz varios exemplos encontrado na net e não consigo resolver.

Como solucionar esse problema?

Exibições: 155

Responder esta

Respostas a este tópico

Olá Antonio, desculpe pela demora em responder, usei firebird por vários anos inclusive com spring security (acegi security na época), username e password são palavras reservadas no fb, vc tem que colocar entre aspas duplas no SQL se quiser usa-las.

Criei uma tabela de usuários para teste:

 

CREATE TABLE USUARIOS (
    ID         INTEGER NOT NULL,
    LOGIN      VARCHAR(30) NOT NULL,
    SENHA      VARCHAR(10) NOT NULL,
    PERMISSAO  VARCHAR(40) NOT NULL
);

 

ID    LOGIN    SENHA    PERMISSAO
1    teste    senha    admin

 

E um programinha de testes que funcionou corretamente:

 

test-context.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc">


    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url"
            value="jdbc:firebirdsql:localhost:C://Projetos//workspaces//teste spring//DB//teste.fdb" />
        <property name="driverClassName" value="org.firebirdsql.jdbc.FBDriver" />
        <property name="username" value="SYSDBA" />
        <property name="password" value="masterkey" />
    </bean>

</beans>

 

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SecurityTest {

    private static final String USERS_BY_USERNAME_QUERY = "SELECT login as \"username\", senha as \"password\", 1 as enabled FROM usuarios WHERE login=lower(?)";

    private static final String AUTHORITIES_BY_USERNAME_QUERY = "SELECT login as \"username\", permissao as authorities FROM usuarios WHERE login=?";

    @Autowired
    private DataSource dataSource;

    @Test
    public void testAuthFail() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager();
        userDetailsService.setDataSource(dataSource);
        userDetailsService
                .setAuthoritiesByUsernameQuery(AUTHORITIES_BY_USERNAME_QUERY);
        userDetailsService.setUsersByUsernameQuery(USERS_BY_USERNAME_QUERY);
        provider.setUserDetailsService(userDetailsService);

        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                "teste", "errada");

        try {
            provider.authenticate(authenticationToken);
            fail("Expected BadCredenialsException");
        } catch (BadCredentialsException expected) {
            assertTrue(true);
        }
    }

    @Test
    public void testAuthOk() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager();
        userDetailsService.setDataSource(dataSource);
        userDetailsService
                .setAuthoritiesByUsernameQuery(AUTHORITIES_BY_USERNAME_QUERY);
        userDetailsService.setUsersByUsernameQuery(USERS_BY_USERNAME_QUERY);
        provider.setUserDetailsService(userDetailsService);

        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                "teste", "senha");
        Authentication auth = provider.authenticate(authenticationToken);

        assertTrue(auth.getAuthorities().toString().equals("[admin]"));

    }
}

 

Qualquer dúvida poste aqui,

abraços.

 

 

Fiz pelo seu método e funcionou.

Obrigado pela ajuda.



Carlos Augusto de Oliveira disse:

Olá Antonio, desculpe pela demora em responder, usei firebird por vários anos inclusive com spring security (acegi security na época), username e password são palavras reservadas no fb, vc tem que colocar entre aspas duplas no SQL se quiser usa-las.

Criei uma tabela de usuários para teste:

 

CREATE TABLE USUARIOS (
    ID         INTEGER NOT NULL,
    LOGIN      VARCHAR(30) NOT NULL,
    SENHA      VARCHAR(10) NOT NULL,
    PERMISSAO  VARCHAR(40) NOT NULL
);

 

ID    LOGIN    SENHA    PERMISSAO
1    teste    senha    admin

 

E um programinha de testes que funcionou corretamente:

 

test-context.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc">


    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url"
            value="jdbc:firebirdsql:localhost:C://Projetos//workspaces//teste spring//DB//teste.fdb" />
        <property name="driverClassName" value="org.firebirdsql.jdbc.FBDriver" />
        <property name="username" value="SYSDBA" />
        <property name="password" value="masterkey" />
    </bean>

</beans>

 

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SecurityTest {

    private static final String USERS_BY_USERNAME_QUERY = "SELECT login as \"username\", senha as \"password\", 1 as enabled FROM usuarios WHERE login=lower(?)";

    private static final String AUTHORITIES_BY_USERNAME_QUERY = "SELECT login as \"username\", permissao as authorities FROM usuarios WHERE login=?";

    @Autowired
    private DataSource dataSource;

    @Test
    public void testAuthFail() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager();
        userDetailsService.setDataSource(dataSource);
        userDetailsService
                .setAuthoritiesByUsernameQuery(AUTHORITIES_BY_USERNAME_QUERY);
        userDetailsService.setUsersByUsernameQuery(USERS_BY_USERNAME_QUERY);
        provider.setUserDetailsService(userDetailsService);

        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                "teste", "errada");

        try {
            provider.authenticate(authenticationToken);
            fail("Expected BadCredenialsException");
        } catch (BadCredentialsException expected) {
            assertTrue(true);
        }
    }

    @Test
    public void testAuthOk() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager();
        userDetailsService.setDataSource(dataSource);
        userDetailsService
                .setAuthoritiesByUsernameQuery(AUTHORITIES_BY_USERNAME_QUERY);
        userDetailsService.setUsersByUsernameQuery(USERS_BY_USERNAME_QUERY);
        provider.setUserDetailsService(userDetailsService);

        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                "teste", "senha");
        Authentication auth = provider.authenticate(authenticationToken);

        assertTrue(auth.getAuthorities().toString().equals("[admin]"));

    }
}

 

Qualquer dúvida poste aqui,

abraços.

 

 

Responder à discussão

RSS

© 2012   Criado por Dr. Spock.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço