Erro ao configurar JAAS no Tomcat 7

Bom dia pessoal

estou com um problema ao configurar o JAAS e o Tomcat 7.

Quando estou desenvolvendo no Eclipse (versão Helios) configuro o tomcat 7 como servidor e configuro o JAAS no arquivo server.xml do tomcat da seguinte forma:

<Realm className="org.apache.catalina.realm.JDBCRealm"
	driverName="com.mysql.jdbc.Driver"
	connectionURL="jdbc:mysql://localhost/sistemas"
	connectionName="root" connectionPassword="root"
	userTable="usuario" userNameCol="login"
	userCredCol="senha" userRoleTable="usuario"
	roleNameCol="role"/>

Com isso, os usuário que terão acesso no sistema serão apenas os que constam na tabela USUARIO.
Até aqui tudo bem, dessa forma configurado funciona perfeitamente.

O Problema começa quando tenho que deixar essa aplicação rodando em um servidor. Instalei um Debian 6 e nele foram instalados as mesmas versões dos aplicativos (Java JDK 1.6, tomcat 7 e mysql server 5.1). Apos a instalação, acesso o endereço http://localhost:8080 para gerenciar o tomcat. Consigo logar com o usuário padrão do tomcat e realizar o deploy da minha aplicação. Feito isso, preciso editar meu arquivo server.xml com o mesmo padrão acima para que o login no sistema funcione. Então é aqui que começa meu problema, pois após a edição do arquivo, reinicio o serviço do tomcat (ja reiniciei o servidor tambem) e quando tento acessar o gerenciamento, não consigo logar nele com o usuário do tomcat. Já tentei logar com algum dos usuarios que estão criados na base mysql e tambem não loga, a minha aplicação abre a tela de login, mas tambem não loga.

O engraçado é que pelo eclipse roda tudo tranquilamente, e quando coloco em um servidor para produção não funciona.

Alguem tem alguma ideia do que pode estar acontecendo?

Utilizo na hoje: Eclipse Helios, JSF 2, Prime Faces 3.3, MySQL 5.1, Tomcat 7 e iReport 3.7

OBS: Quando tiro as linhas que inclui referente ao JAAS no arquivo server.xml, ele volta a logar no gerenciamento do tomcat.

Obrigado!

Alguem??

Alguma ideia??

Procurei por alguns exemplos na internet usando jboss e glassfish junto com o JAAS, o problema é que não consigo rodar nem direto pelo eclipse, nenhum usuario autentica na aplicação função qual hoje funciona com o tomcat configurado no eclipse.

Procurei por mais alguns tutoriais e implementei uma pagina de LoginModule que encontrei em alguns exemplos, porem mesmo assim não funciona.

Estou pensando em trocar o JAAS pelo Spring Security, mas pelo o que andei pesquisando, precisarei trocar muita coisa no projeto.

Você colocou o driver do mysql na lib do tomcat?

Sim, coloquei o driver do mysql na pasta lib.

Fiz a mesma configuração no CentOS 6 e funcionou, estou acessando minha aplicação sem ser pelo eclipse.

Bom dia a todos!

Consegui rodar no Eclipse Juno 3.8.2, com o Glassfish utilizando o JDBCRealm, estou tentando agora é fazer rodar no tomcat mas não estou conseguindo.
Se alguém já passou e conseguiu poderia postar o exemplo.
Se alguém interessar utilizando o Glassfish só avisar.

Obrigado!!!

[quote=mrclaquario]Bom dia a todos!

Consegui rodar no Eclipse Juno 3.8.2, com o Glassfish utilizando o JDBCRealm, estou tentando agora é fazer rodar no tomcat mas não estou conseguindo.
Se alguém já passou e conseguiu poderia postar o exemplo.
Se alguém interessar utilizando o Glassfish só avisar.

Obrigado!!![/quote]
Olá mrclaquario

Onde está dando erro?
Utilizo da seguinte maneira:
1- Configurei no web.xml minha pagina de login, erro e acessos dos usuarios:

&lt;login-config&gt;
  	&lt;auth-method&gt;FORM&lt;/auth-method&gt;
  	&lt;form-login-config&gt;
  		&lt;form-login-page&gt;/login.jsf&lt;/form-login-page&gt;
  		&lt;form-error-page&gt;/loginInvalido.jsf&lt;/form-error-page&gt;
  	&lt;/form-login-config&gt;
  &lt;/login-config&gt;
  &lt;error-page&gt;
  	&lt;error-code&gt;403&lt;/error-code&gt;
  	&lt;location&gt;/erro403.jsf&lt;/location&gt;
  &lt;/error-page&gt;
  &lt;security-constraint&gt;
  	&lt;web-resource-collection&gt;
  		&lt;web-resource-name&gt;Páginas Admin&lt;/web-resource-name&gt;
  		&lt;url-pattern&gt;/index.jsf&lt;/url-pattern&gt;
  		&lt;url-pattern&gt;/Usuarios/*&lt;/url-pattern&gt;
                &lt;url-pattern&gt;/Admin/*&lt;/url-pattern&gt;
  	&lt;/web-resource-collection&gt;
  	&lt;auth-constraint&gt;
  		&lt;role-name&gt;admin&lt;/role-name&gt;
  	&lt;/auth-constraint&gt;
  &lt;/security-constraint&gt;
  &lt;security-constraint&gt;
  	&lt;web-resource-collection&gt;
  		&lt;web-resource-name&gt;Páginas Usuarios&lt;/web-resource-name&gt;
  		&lt;url-pattern&gt;/index.jsf&lt;/url-pattern&gt;
  		&lt;url-pattern&gt;/Usuarios/*&lt;/url-pattern&gt;
  	&lt;/web-resource-collection&gt;
  	&lt;auth-constraint&gt;
  		&lt;role-name&gt;usuarios&lt;/role-name&gt;
  	&lt;/auth-constraint&gt;
  &lt;/security-constraint&gt;
  &lt;security-role&gt;
  	&lt;description&gt;Administrador&lt;/description&gt;
  	&lt;role-name&gt;admin&lt;/role-name&gt;
  &lt;/security-role&gt;
 &lt;security-role&gt;
  	&lt;description&gt;Usuarios&lt;/description&gt;
  	&lt;role-name&gt;usuarios&lt;/role-name&gt;
  &lt;/security-role&gt;

2- Criar a pagina de login:

&lt;form action="j_security_check" method="post"&gt; &lt;!-- os campos action (form) e name (input) devem ser necessariamente os descritos no exemplo --&gt;
&lt;input id="inputUser" name="j_username"/&gt;
&lt;input id="inputPassword" name="j_password" type="password"/&gt;
&lt;input type="submit" value="login"/&gt;
&lt;/form&gt;

3- No servidor tomcat, editar o arquivo server.xml e incluir as seguintes linhas de comando abaixo da linha: <Host appBase=“webapps” autoDeploy=“true” name=“localhost” unpackWARs=“true”>

 &lt;Realm className="org.apache.catalina.realm.JDBCRealm"
				driverName="com.mysql.jdbc.Driver"
				connectionURL="jdbc:mysql://localhost:3306/sua_dataBase"
				connectionName="usuario_mysql" connectionPassword="senha_mysql"
				userTable="Tabela_usuario" userNameCol="login" 
				userCredCol="senha" userRoleTable="Tabela_roles"
				roleNameCol="role"/&gt;

Atente-se para os campos:
userTable: Tabela onde encontrasse os dados de acesso para usuario e senha
userNameCol: Campo da tabela que será utilizado como nome de usuario para login do sistema
userCredCol: Campo da tabela que será utilizado como senha de usuario.
userRoleTable: Tabela onde encontrasse as permissoes dos usuarios
userNameCol: Campo da tabela que utiliza nome da permissao da cadastrada no arquivo web.xml

4- Vc deve ter a lib do mysql-connector na pasta lib do tomcat

Alem desses passos, é necessario criar as tabelas de usuario e roles.

Acredito que seja isso… Veja se já ajuda, qualquer coisa vai postando suas duvidas.

Boa tarde ahdeerre!

Primeiramente muito obrigado pelo apoio, pois ajudou bastante!

Segui sua orientação mas não estou conseguindo utilizar o JDBCRealm na autenticação e nem na autorização. O tomcat sempre pega o usuário e senha do arquivo de configuração server.xml. ;(
O que puder me orientar agradeço bastante…

Att,

Marcelo

[quote=mrclaquario]Boa tarde ahdeerre!

Primeiramente muito obrigado pelo apoio, pois ajudou bastante!

Segui sua orientação mas não estou conseguindo acessar a pagina, logo e autentico mas pelo que percebi não estou com a autorização.
Criei as roles no banco de dados mas não as coloquei no servidor do Tomcat!
O que puder me orientar agradeço bastante…

Att,

Marcelo

[/quote]
Qualquer usuario que vc utilize no login ele da erro como se nao tivesse usuario cadastrado?

ahdeerre,

Fazendo um debug identifiquei que somente pega o usuário e senha do arquivo de configuração do tomcat ‘server.xml’ e as roles que estão associados ao usuário no arquivo.
Sobre o JDBCRealm acredito que não esteja sendo utilizado. Tenho que retirar o REALM padrão que vem no Tomcat?

Att,

Marcelo

[quote=mrclaquario]ahdeerre,

Fazendo um debug identifiquei que somente pega o usuário e senha do arquivo de configuração do tomcat ‘server.xml’ e as roles que estão associados ao usuário no arquivo.
Sobre o JDBCRealm acredito que não esteja sendo utilizado. Tenho que retirar o REALM padrão que vem no Tomcat?

Att,

Marcelo[/quote]
Vc esta rodando a aplicação no eclipse certo? O arquivo server.xml que vc precisa editar é o da pasta que o eclipse cria quando vc adiciona um servidor.
Quase no final do arquivo tem essa linha aqui:

Logo abaixo dela vc deve adicionar seus parametros da mesma forma que passei no exemplo. Ficaria assim:

&lt;Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"&gt;
&lt;Realm className="org.apache.catalina.realm.JDBCRealm"  
            driverName="com.mysql.jdbc.Driver"  
            connectionURL="jdbc:mysql://localhost:3306/sua_dataBase"  
            connectionName="usuario_mysql" connectionPassword="senha_mysql"  
            userTable="Tabela_usuario" userNameCol="login"   
            userCredCol="senha" userRoleTable="Tabela_roles"  
            roleNameCol="role"/&gt; 

Não precisa retirar o padrão, apenas inclua as linhas do Realm logo abaixo do Host appBase e veja se funciona. Lembrando que você deve copiar o .jar do mysql-connector para a pasta lib no diretorio de instalação do tomcat.
Vc utiliza mysql?

ahdeerre,

Consegui fazer funcionar, o que tive que adicionar foi o tipo de criptografia que estou usando para guardar a senha no banco de dados, adicionando a propriedades ‘digest=“SHA-256”’, ficando como o código abaixo:

            &lt;Realm className="org.apache.catalina.realm.JDBCRealm" connectionName="laboratorio" connectionPassword="laboratorio" 
                   connectionURL="jdbc:postgresql://localhost:5432/laboratorio" 
                   driverName="org.postgresql.Driver" roleNameCol="grupo" 
                   userCredCol="senha" userNameCol="usuario" 
                   digest="SHA-256"
                   userRoleTable="seguranca.usuario_grupo" userTable="seguranca.usuario"/&gt; 

Muito obrigado pelo apoio!!!

[quote=mrclaquario]ahdeerre,

Consegui fazer funcionar, o que tive que adicionar foi o tipo de criptografia que estou usando para guardar a senha no banco de dados, adicionando a propriedades ‘digest=“SHA-256”’, ficando como o código abaixo:

            &lt;Realm className="org.apache.catalina.realm.JDBCRealm" connectionName="laboratorio" connectionPassword="laboratorio" 
                   connectionURL="jdbc:postgresql://localhost:5432/laboratorio" 
                   driverName="org.postgresql.Driver" roleNameCol="grupo" 
                   userCredCol="senha" userNameCol="usuario" 
                   digest="SHA-256"
                   userRoleTable="seguranca.usuario_grupo" userTable="seguranca.usuario"/&gt; 

Muito obrigado pelo apoio!!![/quote]

Que bom que deu certo. Uma vez utilizei a criptografia md5, mas não conseguia de jeito nenhum logar no sistema, então retirei a criptografia e funcionou normalmente. Vc disse que fez funcionar no glassfish certo? Poderia me passar um exemplo, é sempre bom conhecer como funciona nos outros servidores, vai que resolvo mudar pro glassfish hahah
Se puder me mandar eu agradeço.
Abraço.

Ahdeere,

Segue em anexo meu projeto (Spring, Hibernate, PrimeFaces, JPA) utilizando JDBCRealm com GlassFish rodando pelo Eplise. Este exemplo é baseado no exemplo original do artigo da revista JM 114 e 115 ‘Criando Aplicações Web Seguras’
O GlassFish baixei a ultima versão (3.1.2.2) descompactei e rodei via console para garantir que estava funcionando, pelo eclipse baixei o plugin do GlassFish para versão do meu eclipse mas tive que alterar uma configuração do GlassFish no arquivo ‘dominio.xml’ que fica na pasta ‘%GLASSFISH_HOME%\glassfish\domains\domain1\config’ mudando a porta 8080 para 9090 ai funciona que é uma beleza.

A configuração da Realm deve ser criada no servidor via console web ‘Configurations>server-config>security>Realm’ e preenchido os dados:

Meu exemplo está utilizando o banco de dados do postgres, mas o exemplo original utiliza o mysql que abaixo o banco:

   CREATE DATABASE  IF NOT EXISTS `segurancabd`
 USE `segurancabd`;
   
 CREATE TABLE `usuario` (
   `USUARIO` varchar(45) NOT NULL,
   `SENHA` varchar(72) NOT NULL,
   PRIMARY KEY (`USUARIO`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 /*!40101 SET character_set_client = @saved_cs_client */;
   
 INSERT INTO `usuario` VALUES
 ('admin','8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918'),
 ('aluno','a21d6f3803f0491c32444ef91a0836be243cc4da5186357e805b7009a5b0669b'),
 ('diretor','9ca2623b06e4192ea3d41f4c709a5fbd98fcddb12a59ac11fe3c44667667e14a'),
 ('secretaria','3e7100903faebe330d30fd23a5563830568bca178d5210986163528da8fac196');
   
 CREATE TABLE `usuario_grupo` (
   `usuario` varchar(45) NOT NULL,
   `grupo` varchar(45) NOT NULL,
   PRIMARY KEY (`usuario`,`grupo`),
   CONSTRAINT `usuario_grupo_FK` FOREIGN KEY (`usuario`)
 REFERENCES `usuario` (`usuario`) ON DELETE
NO ACTION ON UPDATE NO ACTION
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
   
 INSERT INTO `usuario_grupo` VALUES ('admin','ADMIN'),
 ('aluno','ALUNO'),
 ('diretor','DIRETOR'),
 ('secretaria','SECRETARIA');


Leia mais em: Criando aplicações web seguras ? Parte 1 - Revista Java Magazine 114 http://www.devmedia.com.br/criando-aplicacoes-web-seguras-parte-1-revista-java-magazine-114/27503#ixzz2VGfFVa48

Att,

Marcelo

Muito obrigado pelo exemplo vou ver se consigo rodar ele aqui.

Abraço