Problema com Autenticação com o Spring Security

9 respostas
R

Olá para todos!

Estou com o seguinte problema, tenho uma aplicação desktop cliente/servidor e estou desenvolvendo alguns módulos web com primefaces, hibernate e spring security. Estou com problema na autenticação do Spring pois o meu banco de dados, na tabela de usuarios, a senha esta encripitada por um algoritimo proprio da aplicação desktop. Por essa razão a autenticação nao funciona, se eu entrar no banco e colocar a senha sem criptografar funciona na boa.

Minha pergunta é o seguinte, existe alguma maneira de eu configurar o spring para ao inves de ele usar password encoder md5 usar a minha classe de criptografia antes de fazer a autenticação ou alguem tem uma ideia para resolver este problema de uma outra maneira?

Obrigado.

Rafael Mendonça.

9 Respostas

A

Passos:

  1. Coloque no xml o seguinte:
<authentication-provider>
			<password-encoder ref="" />
                         ...
</authentication-provider>
  1. No “ref”, coloque um bean que implemente PasswordEncoder.

[]'s

R

Obrigado pela resposta mais ainda fiquei com dúvidas como eu crio bean??

Eu devo criar uma classe que implementa PasswordEncoder para fazer a minha criptografia?

A

Rafael Mendon?:
Obrigado pela resposta mais ainda fiquei com dúvidas como eu crio bean??

Eu devo criar uma classe que implementa PasswordEncoder para fazer a minha criptografia?

Isso mesmo. Você pode até criar uma que encapsula a classe que você já tem (evitando, assim, refatorar ela), mas mesmo assim, você precisa de uma que implemente PasswordEncoder (para que o Spring Security saiba qual método invocar :wink: )

[]'s

R

Boa tarde… fiz o que vc sugeriu… mas estou com dificuldades em configurar o xml… fiz assim:

<authentication-manager>
        <authentication-provider>
            <password-encoder ref="passwordEncoder" />
            <jdbc-user-service data-source-ref="dataSource"
               users-by-username-query="SELECT login, senha, situacao = 0 AS ativo FROM usuarios WHERE login=?"
               authorities-by-username-query="SELECT u.login, p.nome FROM usuarios u, perfisusuario p WHERE u.perfilusuario = p.perfilusuario AND u.login=?"
            />
        </authentication-provider>
    </authentication-manager>
    
    <bean id="passwordEncoder" class="br.com.erpnasajon.seguranca.Encoder">
        <property name="dataSource" ref="dataSource"/>
    </bean>

Esta certo?

A classe Encoder que implementa a PasswordEncoder e nela faço meu algoritimo de encripitaçao mas ao rodar a aplicação dá o seguinte erro:

Grave: Exception while invoking class com.sun.enterprise.web.WebApplication start method
java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 26 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 26; columnNumber: 76; cvc-complex-type.2.4.c: O curinga correspondente é restrito, mas nenhuma declaração pode ser encontrada para o elemento 'bean'.
	at com.sun.enterprise.web.WebApplication.start(WebApplication.java:138)
	at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130)
	at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269)
	at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:294)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:462)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:382)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1064)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1244)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1232)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:459)
	at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:209)
	at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:238)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)

Grave: Exception while loading the app
Grave: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 26 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 26; columnNumber: 76; cvc-complex-type.2.4.c: O curinga correspondente é restrito, mas nenhuma declaração pode ser encontrada para o elemento 'bean'.
A

O authentication-manager pertence ao namespace do Spring Security, e o bean, ao namespace padrão.

R

Olá camarada… boa tarde…

Eu ainda sou um pouco leigo no assunto. O que voce disse na sua resposta é para eu copiar o bean abaixo do Application-Context.xml para o arquivo Web.xml ou é para fazer uma outra coisa que eu nao entendi?

<bean id="passwordEncoder" class="br.com.erpnasajon.seguranca.Encoder">  
        <property name="dataSource" ref="dataSource"/>  
    </bean>

Abraços,

A

Poste o seu arquivo de configuração do Spring. Essas configurações devem ficar nesse arquivo, não no web.xml.

R

Segue o arquivo para você dar uma olhada.

<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:b="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="/index.jsf" access="hasRole('ADMINISTRADORES')"/>
        <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?erro=true"/>
        <logout/>
    </http>
    
    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
               users-by-username-query="SELECT login, senha, situacao = 0 AS ativo FROM usuarios WHERE login=?"
               authorities-by-username-query="SELECT u.login, p.nome FROM usuarios u, perfisusuario p WHERE u.perfilusuario = p.perfilusuario AND u.login=?"
            />
        </authentication-provider>
    </authentication-manager>
	
	<bean id="passwordEncoder" class="br.com.erpnasajon.seguranca.Encoder">  
        <property name="dataSource" ref="dataSource"/>  
    </bean>  

    <b:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <b:property name="url" value="jdbc:postgresql://localhost:5432/ga" />
        <b:property name="driverClassName" value="org.postgresql.Driver" />
        <b:property name="username" value="postgres" />
        <b:property name="password" value="123456" />
    </b:bean>

</b:beans>
A

Modifique para ficar assim:

<?xml version="1.0" encoding="UTF-8"?>  
<b:beans xmlns="http://www.springframework.org/schema/security"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:b="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="/index.jsf" access="hasRole('ADMINISTRADORES')"/>  
        <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?erro=true"/>  
        <logout/>  
    </http>  
      
    <authentication-manager>  
        <authentication-provider>  
            <jdbc-user-service data-source-ref="dataSource"  
               users-by-username-query="SELECT login, senha, situacao = 0 AS ativo FROM usuarios WHERE login=?"  
               authorities-by-username-query="SELECT u.login, p.nome FROM usuarios u, perfisusuario p WHERE u.perfilusuario = p.perfilusuario AND u.login=?"  
            />  
        </authentication-provider>  
    </authentication-manager>  
      
    <b:bean id="passwordEncoder" class="br.com.erpnasajon.seguranca.Encoder">    
        <b:property name="dataSource" ref="dataSource"/>    
    </b:bean>    
  
    <b:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >  
        <b:property name="url" value="jdbc:postgresql://localhost:5432/ga" />  
        <b:property name="driverClassName" value="org.postgresql.Driver" />  
        <b:property name="username" value="postgres" />  
        <b:property name="password" value="123456" />  
    </b:bean>  
  
</b:beans>
Criado 27 de janeiro de 2012
Ultima resposta 30 de jan. de 2012
Respostas 9
Participantes 2