Autenticação via portal e WebService usando Spring Security

Boa noite amigos.

Mais uma vez recorro à vossa inestimável ajuda…

Fiz um pequeno sistema Web utilizando JSF + Hibernate + Spring Security + GlassFish 3. Tudo está funcionando a contento. Faço o login, o Spring gerencia os acessos, tudo maravilha.

Coloco abaixo o applicationContext-security.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">
	
        <http auto-config='true'>

            <intercept-url pattern="/admin/**" access="ROLE_ADMINISTRADOR" />
            <!--intercept-url pattern="/restrito/**" access="ROLE_USUARIO" /-->
            <form-login login-page="/publico/login.jsf"
                    always-use-default-target="true"
                    default-target-url="/admin/lista_classes_por_professor.jsf"
                    authentication-failure-url="/publico/login.jsf?login_error=1" />
            <logout/>
            <remember-me />
	</http>

	<authentication-manager>
            <authentication-provider>
                <!--user-service>
                    <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMINISTRADOR" />
                    <user name="bob" password="bobspassword" authorities="ROLE_USER" />
                </user-service-->
                <jdbc-user-service 
                    data-source-ref="dataSource"
                    authorities-by-username-query="SELECT u.login, p.permissao 
                                                   FROM usuario as u, usuario_permissao as p
                                                   where u.acesso = p.id
                                                   AND u.login = ?"
                    users-by-username-query="SELECT login, senha, ativo 
                                             FROM usuario 
                                             WHERE login = ?" />
                
            </authentication-provider>
	</authentication-manager>
    
</beans:beans>

E agora o applicationContext.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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/jdbc.properties" />

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${jdbc.driverClassName}"
          p:url="${jdbc.url}"
          p:username="${jdbc.username}"
          p:password="${jdbc.password}" />
</beans>

Tudo está funcionando blz!!!

Porém…rs

Alguns dos dados deste sistema precisarão ser acessados via mobile, então eu comecei a criar um WebService no projeto (estou usando JAX-WS). Aí que cagou tudo…rsrsrs…pq eu não sei como faço para fazer o login no sistema pelo WebService…e se eu não logar não consigo acessar a camada de negócios para bater as queries no banco, pois tenho lá um Filter barrando tudo, só quem tem o ROLE_ADMIN consegue chegar lá…

Estou pesquisando há alguns dias antes de postar… Não encontrei um único tópico/ exemplo de uma aplicação onde poderia logar tanto via página web e webservice, também fui atrás de alguns livros e nada…peguei a documentação do Spring que é muito boa mas também não ajudou…
Algum dos distintos colegas do fórum poderiam, piedosamente me ajudar?

Desde já agradeço muitíssimo a atenção!

E ai Blz!!

veja bem, se seu applicationContext-security.xml esta exatamente como vc descreveu, talvez seja por isso que vc tem acesso só como administrador pois, sua linha
de acesso como usuario esta comentada.

Grande aprendizweb!!!

Cara, muitíssimo obrigado pela sua ajuda!!!

Então cara, o ponto é que estou tentando logar com credenciais de administrador… :frowning:
A minha grande dificuldade encontra-se em configurar o WebService e o Spring…n estou conseguindo fazer isso…Vi na web alguma coisa usando um tal de UserDetails…mas n consegui entender…

Você faz alguma idéia de como eu configuro o WebService com o Spring sem comprometer o que já está funcionando?

Mais uma vez agradeço sua ajuda…já estava perdendo as esperanças…rsrsrs

Se o client que acessará o WS for também usando browser, você poderia tentar utilizando o basic authentication. Quando alguém tentar acessar o wsdl, será automaticamente requisitado as credenciais.

Talvez vc não tenha configurado seu filtro no web.xml para liberar a conexão para uma requisisão de webservice, como esta seu web.xml?

Obrigado pelas respostas senhores!!!

Eu vou consumir o WebService através de uma aplicação mobile…

O que estou me perdendo é o seguinte, sei que este trecho de código é o responsável por autenticar pela página de login:

<form-login login-page="/publico/login.jsf" always-use-default-target="true" default-target-url="/admin/lista_classes_por_professor.jsf" authentication-failure-url="/publico/login.jsf?login_error=1" />

Que faz esta query para verificar o usuário:

<jdbc-user-service data-source-ref="dataSource" authorities-by-username-query="SELECT u.login, p.permissao FROM usuario as u, usuario_permissao as p where u.acesso = p.id AND u.login = ?" users-by-username-query="SELECT login, senha, ativo FROM usuario WHERE login = ?" />

Como eu posso fazer para uma chamada de método do WebService login(user, senha) também seja autenticado pelo Spring…

Este código basta ou tenho que fazer mais alguma coisa?

Muito obrigado pelas ajudas…

Eu vou colocar meu web.xml aqui pra vcs darem uma olhada…

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


contextConfigLocation
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml


javax.faces.PROJECT_STAGE
Development


org.springframework.web.context.ContextLoaderListener


dispatcher
org.springframework.web.servlet.DispatcherServlet
2


Faces Servlet
javax.faces.webapp.FacesServlet
1


dispatcher
.htm


Faces Servlet
.jsf



30

<filter>
    <filter-name>conexaoFilter</filter-name>
    <filter-class>br.com.sistemaescola.filter.ConexaoHibernateFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>conexaoFilter</filter-name>
    <url-pattern>*.jsf</url-pattern>
</filter-mapping>

<!--resource-ref>
    <description>DataSource SistemaEscola</description>
    <res-ref-name>jdbc/SistemaEscolaDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref-->

<!-- Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
    


<welcome-file-list>
    <welcome-file>redirect.jsf</welcome-file>
</welcome-file-list>

[/code]

Muito obrigado senhores!!!

Bom! eu nunca fiz, apenas já li a respeito mais tente fazer a alteração abaixo!!!

<filter> <filter-name>conexaoFilter</filter-name> <filter-class>br.com.sistemaescola.filter.ConexaoHibernateFilter</filter-class> </filter> //esta linha libera a conexão para requisição JSF <filter-mapping> <filter-name>conexaoFilter</filter-name> <url-pattern>*.jsf</url-pattern> </filter-mapping> // talvez falte essa que libera conexão para requisiçao de webservice, testa lá <filter-mapping> <filter-name>conexaoFiter</filter-name> <url-pattern>/webservice/*</url-pattern> </filter-mapping>

hmmmmmmm…faz sentido!

Eu vou testar hoje à noite (pois o projeto está em casa) e posto os resultados.

Vlw pela a força brother!!!

Senhores…consegui testar aqui…

Estou tendo o erro abaixo…

Segue minha classe para o WebService:

[code]package br.com.sistemaescola.webservice;

import br.com.sistemaescola.pojos.Usuario;
import br.com.sistemaescola.webservice.util.UserDetailsServiceImpl;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

/**
*

  • @author danielhenriquelima
    */
    @WebService(serviceName = “IntegracaoMobile”)
    public class IntegracaoMobile {

    /**

    • This is a sample web service operation
      */
      @WebMethod(operationName = “hello”)
      public String hello(@WebParam(name = “name”) String txt) {
      return “Hello " + txt + " !”;
      }

    /**

    • Web service operation
      */
      @WebMethod(operationName = “login”)
      public Usuario login(@WebParam(name = “usuario”) String usuario, @WebParam(name = “senha”) String senha) {
      //TODO write your implementation code here:

      UserDetailsServiceImpl userDetail = new UserDetailsServiceImpl();

      return (Usuario) userDetail.loadUserByUsername(usuario);
      }
      }[/code]

Agora a classe que eu acredito que faça o “meio de campo” com o Spring:

[code]package br.com.sistemaescola.webservice.util;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import br.com.sistemaescola.pojos.Usuario;
import br.com.sistemaescola.rn.UsuarioRN;

public class UserDetailsServiceImpl implements UserDetailsService {

UsuarioRN usuarioRN = new UsuarioRN();
String senha;


@Override
public UserDetails loadUserByUsername(String userName)throws UsernameNotFoundException, DataAccessException 
{
    
	Usuario usuario = null;
	try 
    {
	usuario = usuarioRN.buscarPorLogin(userName);
} 
    catch (Exception e) 
    {
		// TODO Auto-generated catch block
    	System.out.println("ERROR: "+e.getMessage());
} 
	
    if (usuario == null)
        throw new UsernameNotFoundException("User not found: " + userName);
    else {
       	        	
        return makeUser(usuario);
    }
}

private User makeUser(Usuario user) {
    return new User(user.getNome(), "minhasenha", true, true, true, true, makeGrantedAuthorities(user));
}

private List<GrantedAuthority> makeGrantedAuthorities(Usuario user) {
	List<GrantedAuthority> result = new ArrayList<GrantedAuthority>();       
    
	result.add(new GrantedAuthorityImpl("ROLE_ADMINISTRADOR"));

    return result;
}

}[/code]

Note que estou hardcodando os campos de senha e role para fins de debug…
E é aqui que parei…

ALguma idéia?

Vlw mesmo mais uma vez!!!

Olá ARATHORN vc conseguiu pois estou tentando fazer algo parecido.

Olá @paulohddias @ARATHORN

obviamente as postagens são antigas, mas entendo a importância de mantê-las respondidas ou pelo menos com alguma referência para futuros usuários que encontrem-nas durante a busca de solução semelhante. Assim, compartilho minha busca por uma solução semelhante e algumas referências que encontrei.

Seguem os links:


(solução semelhante no meu caso)
.