Jaas

Galera,

há alguns dias estou estudando/pesquisando sobre JAAS e tentantando entender o funcionamento desta API, já li e implementei o o exemplo do artigo http://www.guj.com.br/articles/184 e de outros sites onde andei pesquisando sobre o assunto. Já vi vários tópicos sobre este assunto aqui na comunidade e muitas outras pessoas com diversas dúvidas assim como eu.

Apesar da simplicidade como o assunto é tratado aqui e em vários outros fóruns por onde andei, confesso que não estou conseguindo assimilar as informações.

Gostaria que alguma alma iluminada pelo espírtio natalino e pela esperança de renovação e prosperidade que o novo ano há de trazer pudesse me ajudar…rsrsrs

Segue abaixo passo-a-passo do exemplo que implementei (alterei o nome de algumas classes):

Criei as classes ‘User’ e ‘Role’ implementando ‘java.security.Principal’ e a classe ‘AppLoginModule’ implementando ‘LoginModule’ conforme exemplos do artigo sobre JAAS ]http://www.guj.com.br/articles/184. Aqui vale o primeiro comentário, pois dentro do método ‘validaUsuario(Connection conn)’ existe um IF que dá erro conforme abaixo:

       if (senhaInformado.equals(senhaBanco)) {  
            user = new User(login);  /* login fica marcado como erro */
            recuperaRoles(conn);  
            user.setRoles(roles);  
            return;  
        } else {  
            throw new LoginException("Senha Inválida.");  
        }

Pelo que entendi quem deveria ser passado é o atributo ‘loginInformado’, e foi o que fiz…

Em seguida, gerei o jar do projeto ‘AppJAAS.jar’ e coloquei dentro da pasta \lib do TOMCAT.

Gerei um arquivo .config (‘AppJAAS.config’) da seguinte maneira e coloquei dentro da pasta do TOMCAT \conf:

AppJAAS{
  br.com.security.AppLoginModule required
	dataSourceName="jdbc:mysql://HOME-PC/db_teste_jaas"
        sqlUser="select senha from tb_usuario where login=?"  
        sqlRoles="select id_role from tb_usuario_roles where login=?"
  ;
};

Lembrando que no MySQL tenho estas duas tabelas(‘tb_usuario’ e ‘tb_usuario_roles’) dentro do banco ‘db_teste_jaas’, onde na tabela roles possuo dois usuários com as ‘id_role’ ADMINS e USERS.

Em seguida, abri o arquivo ‘catalina.bat’, presente no diretório \bin do TOMCAT, e antes da linha comentada ‘Execute The Requested Command’, inseri o comando abaixo:

set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config="%CATALINA_BASE%\conf\AppJAAS.config"

Isto feito, criei um projeto WEB no ecplipse de nome ‘TestJAAS’, onde criei o ‘REALM’ dentro da pasta META-INF (‘context.xml’):

<?xml version="1.0" encoding="UTF-8"?>
<Context auth="Container">
	<Realm className="org.apache.catalina.realm.JAASRealm" appName="AppJAAS"
		userClassNames="br.com.security.principals.User"
		roleClassNames="br.com.security.principals.Role" />
</Context>

Esta parte foi a que tive mais dúvidas pois sinceramente nunca tinha ouvido falar ‘REALM’.

Dentro do web.xml adicionei as restrições e as roles, conforme abaixo:

 <!-- Retrições -->
 <security-constraint>
		<display-name>Teste JAAS 1</display-name>
		<web-resource-collection>
			<web-resource-name>Teste JAAS 1</web-resource-name>
			<url-pattern>/teste1.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>ADMINS</role-name>
		</auth-constraint>
	</security-constraint>

	<security-constraint>
		<display-name>Teste JAAS 2</display-name>
		<web-resource-collection>
			<web-resource-name>Teste JAAS 2</web-resource-name>
			<url-pattern>/teste2.jsp</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>USERS</role-name>
		</auth-constraint>
	</security-constraint>

	<!-- Lista de Roles -->
	<security-role>
		<description>Administrador</description>
		<role-name>ADMINS</role-name>
	</security-role>

	<security-role>
		<description>Usuário</description>
		<role-name>USERS</role-name>
	</security-role>

E duas JSP (teste1.jsp e teste2.jsp) que quando tentam ser acessadas são redirecionadas para a JSP de login (login.jsp):

teste1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
ADMINS
</body>
</html>

teste2.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
USERS
</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<form method="POST"
		action="<%=request.getContextPath()%>/j_security_check">
		Usuário: <input type="text" name="j_username" size="15"><br>
		Senha: <input type="password" name="j_password" maxlength="20"
			size="15">
			<input type="submit" value="Login" />
	</form>
</body>
</html>

Aqui é a minha dúvida, quando acesso tanto teste1.jsp quanto teste2.jsp sou redirecionado para login.jsp, porém, quando entro com o login e senha que estão na tabela do MySQL tb_usuario aparece no console o seguinte erro:

28/12/2011 12:39:31 org.apache.catalina.realm.JAASRealm authenticate
GRAVE: Unexpected error
java.lang.SecurityException: Não é possível localizar uma configuração de logon
	at com.sun.security.auth.login.ConfigFile.<init>(Unknown Source)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at javax.security.auth.login.Configuration$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.Configuration.getConfiguration(Unknown Source)
	at javax.security.auth.login.LoginContext$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.init(Unknown Source)
	at javax.security.auth.login.LoginContext.<init>(Unknown Source)
	at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:394)
	at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:334)
	at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:282)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:440)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Não é possível localizar uma configuração de logon
	at com.sun.security.auth.login.ConfigFile.init(Unknown Source)
	... 30 more

Gostaria que me ajudassem pois não estou entendendo este erro… e se possível me indicassem se existe algo errado nos procedimentos acima…

Qualquer ajuda agradeço !

Cara não entendi sua duvida, tem como simplificar?
Eu tb tava estudando JAAS, ate agora eu não sei fazer as permissões nisso! kkkkkkkk
Então procurei outros meios e achei PhaseListener, dá uma pesquisada sobre ele!
OK!?

sipauba,

É sempre bom lembrar, que se você adotar o JAAS, as permissões ficarão a nível de servidor e não de aplicação. Como xandi_m5 falou, é interessante trabalhar com o PhaseListener, ou se desejar com o Spring Security (http://www.edsongoncalves.com.br/2010/05/04/seguranca-com-spring-security-3-0-utilizando-banco-de-dados-em-apenas-alguns-minutos/

[ ]'s

sipauba,
você consegui resolver o seu problema de configuração estou com o mesmo problema:

java.lang.SecurityException: Não é possível localizar uma configuração de logon
	at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:93)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at javax.security.auth.login.Configuration$3.run(Configuration.java:247)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:242)
	at javax.security.auth.login.LoginContext$1.run(LoginContext.java:237)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.init(LoginContext.java:234)
	at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
	at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:394)
	at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:334)
	at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:295)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:450)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.IOException: Não é possível localizar uma configuração de logon
	at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:250)
	at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:91)
	... 28 more

ja tentei no catalina sh do tomcast 7 o seguinte:
set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config="%CATALINA_BASE%/conf/jaas.config"
JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config="%CATALINA_BASE%/conf/jaas.config"
set JAVA_OPTS= -Djava.security.auth.login.config="$CATALINA_BASE\conf\jaas.config"
JAVA_OPTS= -Djava.security.auth.login.config="$CATALINA_BASE\conf\jaas.config"

alguém conseguiu???