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 !