Erro ao configurar JAAS no Tomcat 7

14 respostas
A

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!

14 Respostas

A

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.

C

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

A

Sim, coloquei o driver do mysql na pasta lib.

A

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

M

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!!!

A

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!!!


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.

M

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

A

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


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

M

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

A

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


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?

M

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!!!

A

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!!!

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.

M

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

A

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

Abraço

Criado 19 de abril de 2013
Ultima resposta 4 de jun. de 2013
Respostas 14
Participantes 3