Bonjour!
J'essaie d'implémenter une authentification simple avec jGuard en employant l'authentification par XML. J'ai réutilisé les documents de config provenant de l'exemple jGuard struts et je les ai adaptés à mes besoins. J'ai ajouté les jars nécessaires, mais l'authentification ne fonctionne pas, je reçoit une LoginException...
Voici le contenu de mon log (WebSphere) :
-----------------------------------------
[18.11.07 14:55:10:449 CET] 00000026 AuditManager I user is null : subject is null implies logonProcess phase
[18.11.07 14:55:10:465 CET] 00000026 AuditManager I user is null : AUTHENTICATION TYPE =FORM implies authenticate phase
[18.11.07 14:55:10:512 CET] 00000026 SystemOut O 2007-11-18 14:55:10 [WebContainer : 1] ERROR net.sf.jguard.ext.util.ThrowableUtils - authentication failed.LoginException login.error
javax.security.auth.login.FailedLoginException: login.error
at net.sf.jguard.ext.authentication.loginmodules.XmlLoginModule.login(XmlLoginModule.java:177)
at net.sf.jguard.core.authentication.configuration.LocalLoginContext.login(LocalLoginContext.java:163)
at net.sf.jguard.ext.authentication.manager.AuthenticationUtils.login(AuthenticationUtils.java:94)
at net.sf.jguard.jee.authentication.http.HttpAuthenticationUtils.useLoginContext(HttpAuthenticationUtils.java:91)
at net.sf.jguard.jee.authentication.http.HttpAuthenticationUtils.authenticate(HttpAuthenticationUtils.java:152)
at net.sf.jguard.jee.authentication.http.AccessFilter.authenticate(AccessFilter.java:618)
at net.sf.jguard.jee.authentication.http.AccessFilter.logonProcess(AccessFilter.java:474)
at net.sf.jguard.jee.authentication.http.AccessFilter.doFilter(AccessFilter.java:216)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:696)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:641)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:475)
at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:463)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3107)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:238)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:811)
at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1425)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:92)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:465)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:394)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:274)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:152)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:213)
at com.ibm.io.async.AbstractAsyncFuture.fireCompletionActions(AbstractAsyncFuture.java:195)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:193)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:725)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:847)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1498)
[18.11.07 14:55:10:527 CET] 00000026 SystemOut O 2007-11-18 14:55:10 [WebContainer : 1] WARN net.sf.jguard.ext.util.ResourceBundleUtils - There is not specific bundle to get messages: create a JGuard.properties and copy it to your application base classpath
[18.11.07 14:55:10:527 CET] 00000026 AuditManager I user is null : authentication failed implies redirect to /faces/pages/authenticationFailed.jsp
[18.11.07 14:55:10:543 CET] 00000026 AuditManager I user is null : NOT BASIC AUTHENTICATION - user is not authenticated implies redirect to /isweb/faces/pages/authenticationFailed.jsp
[18.11.07 14:55:10:543 CET] 00000026 AuditManager I user is null : subject is null implies logonProcess phase
[18.11.07 14:55:10:559 CET] 00000026 AuditManager I user is null : AUTHENTICATION TYPE =FORM implies authenticate phase
[18.11.07 14:55:10:574 CET] 00000026 SystemOut O 2007-11-18 14:55:10 [WebContainer : 1] ERROR net.sf.jguard.ext.util.ThrowableUtils - authentication failed.LoginException login.error
javax.security.auth.login.FailedLoginException: login.error
at net.sf.jguard.ext.authentication.loginmodules.XmlLoginModule.login(XmlLoginModule.java:177)
at net.sf.jguard.core.authentication.configuration.LocalLoginContext.login(LocalLoginContext.java:163)
at net.sf.jguard.ext.authentication.manager.AuthenticationUtils.login(AuthenticationUtils.java:94)
at net.sf.jguard.jee.authentication.http.HttpAuthenticationUtils.useLoginContext(HttpAuthenticationUtils.java:91)
at net.sf.jguard.jee.authentication.http.HttpAuthenticationUtils.authenticate(HttpAuthenticationUtils.java:152)
at net.sf.jguard.jee.authentication.http.AccessFilter.authenticate(AccessFilter.java:618)
at net.sf.jguard.jee.authentication.http.AccessFilter.logonProcess(AccessFilter.java:474)
at net.sf.jguard.jee.authentication.http.AccessFilter.doFilter(AccessFilter.java:216)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:696)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:641)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:475)
at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:463)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3107)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:238)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:811)
at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1425)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:92)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:465)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:394)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:152)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:213)
at com.ibm.io.async.AbstractAsyncFuture.fireCompletionActions(AbstractAsyncFuture.java:195)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:193)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:725)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:847)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1498)
Ce message est affiché en boucle jusqu'à ce que je ferme le navigateur (ou stop)...
Mes différents fichiers de config :
--------------------------------
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlnssi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>isweb</display-name>
<description>Inscription on-line aux activités de l'Institut du Sport</description>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<description>
Set this flag to true if you want the JavaServer Faces
Reference Implementation to validate the XML in your
faces-config.xml resources against the DTD. Default value is
false.
</description>
<param-name>com.sun.faces.validateXml</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<description>
Set this flag to true if you want the JavaServer Faces
Reference Implementation to verify that all of the
application objects you have configured (components,
converters, renderers, and validators) can be successfully
created. Default value is false.
</description>
<param-name>com.sun.faces.verifyObjects</param-name>
<param-value>true</param-value>
</context-param>
<!-- Localisation des fichiers de configuration pour l'authentification et les autorisations jGuard -->
<context-param>
<param-name>authenticationConfigurationLocation</param-name>
<param-value>/WEB-INF/conf/jGuard/jGuardAuthentication.xml</param-value>
</context-param>
<context-param>
<param-name>authorizationConfigurationLocation</param-name>
<param-value>/WEB-INF/conf/jGuard/jGuardAuthorization.xml</param-value>
</context-param>
<!-- Filtre jGuard gérant les autorisations du site -->
<filter>
<filter-name>AccessFilter</filter-name>
<filter-class>net.sf.jguard.jee.authentication.http.AccessFilter</filter-class>
<init-param>
<param-name>configurationLocation</param-name>
<param-value>/WEB-INF/conf/jGuard/jGuardFilter.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AccessFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- jGuard SessionListener -->
<listener>
<listener-class>net.sf.jguard.jee.listeners.SessionListener</listener-class>
</listener>
<!-- jGuard ContextListener -->
<listener>
<listener-class>net.sf.jguard.jee.listeners.ContextListener</listener-class>
</listener>
<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<!-- Faces Servlet Mapping -->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>pages/registrationMenu.jsp</welcome-file>
</welcome-file-list>
</web-app>
jGuardFilter.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration SYSTEM "jGuardFilter_1.00.dtd">
<configuration>
<filter>
<!-- Index uri of your web application. -->
<indexURI>/faces/pages/registrationMenu.jsp</indexURI>
<!-- Uri when the user authentication failed. -->
<authenticationFailedURI>/faces/pages/authenticationFailed.jsp</authenticationFailedURI>
<!-- Uri to access to the authentication form -->
<logonURI>/faces/pages/login.jsp</logonURI>
<!-- uri to be authenticated. The action property of the authentication form MUST NOT be set to j_security_check. -->
<logonProcessURI>/jguardLogin</logonProcessURI>
<registerURI></registerURI>
<registerProcessURI></registerProcessURI>
<!-- uri to to be unauthenticated -->
<logoffURIs>
<logoffURI>/Logoff.do</logoffURI>
</logoffURIs>
<!-- uri when access to a ressource is denied -->
<accessDeniedURI>/faces/pages/accessDenied.jsp</accessDeniedURI>
<authScheme>FORM</authScheme>
<loginField>username</loginField>
<!-- Parameter's name of the form's field which holds the password. All values are accepted except j_password. -->
<passwordField>password</passwordField>
<goToLastAccessDeniedUriOnSuccess>true</goToLastAccessDeniedUriOnSuccess>
</filter>
</configuration>
jGuardAuthentication.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration SYSTEM "jGuardAuthentication_1.00.dtd">
<configuration>
<authentication>
<!-- 'local' or 'jvm' -->
<scope>local</scope>
<!-- boolean option('true' or 'false'), to activate the authorization debug mode -->
<debug>true</debug>
<includeOldConfig>false</includeOldConfig>
<!-- java.security.auth.login.config -->
<includeConfigFromJavaParam>false</includeConfigFromJavaParam>
<includePolicyFromJavaParam>false</includePolicyFromJavaParam>
<!-- <digestAlgorithm>MD5</digestAlgorithm> -->
<!-- <salt>qsd846sdq6ds4</salt> -->
<authenticationManager>net.sf.jguard.ext.authentication.manager.XmlAuthenticationManager</authenticationManager>
<authenticationManagerOptions>
<option>
<name>authenticationXmlFileLocation</name>
<value>WEB-INF/conf/jGuard/jGuardUsersPrincipals.xml</value>
</option>
</authenticationManagerOptions>
<loginModules>
<!-- specify which loginModules are used for authentication. -->
<!-- <loginModule>
<name>com.ibm.ws.security.server.lm.ltpaLoginModule</name> -->
<!-- flag :'REQUIRED','OPTIONAL','REQUISITE' or 'SUFFICIENT' -->
<!-- <flag>OPTIONAL</flag>
</loginModule>
<loginModule>
<name>ch.unifr.auth.UnifrLoginModule</name>
<flag>OPTIONAL</flag>
</loginModule> -->
<loginModule>
<name>net.sf.jguard.ext.authentication.loginmodules.XmlLoginModule</name>
<!-- flag :'REQUIRED','OPTIONAL','REQUISITE' or 'SUFFICIENT' -->
<flag>REQUIRED</flag>
<loginModuleOptions>
<option>
<name>debug</name>
<value>true</value>
</option>
</loginModuleOptions>
</loginModule>
</loginModules>
</authentication>
</configuration>
jGuardUsersPrincipals.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE usersPrincipals SYSTEM "jGuardUsersPrincipals_1.00.dtd">
<usersPrincipals>
<principals>
<principal>
<name>admin</name>
<class>net.sf.jguard.core.principals.RolePrincipal</class>
<applicationName>isweb</applicationName>
</principal>
<principal>
<name>guest</name>
<class>net.sf.jguard.core.principals.RolePrincipal</class>
<applicationName>isweb</applicationName>
</principal>
<principal>
<name>customer</name>
<class>net.sf.jguard.core.principals.RolePrincipal</class>
<applicationName>anotherApplication</applicationName>
</principal>
</principals>
<users>
<userTemplate>
<name>default</name>
<privateRequiredCredentials>
<credTemplateId identity="true">login</credTemplateId>
<credTemplateId digestNeeded="true">password</credTemplateId>
</privateRequiredCredentials>
<publicRequiredCredentials>
<credTemplateId>firstname</credTemplateId>
<credTemplateId>lastname</credTemplateId>
<credTemplateId>location</credTemplateId>
</publicRequiredCredentials>
<privateOptionalCredentials>
<credTemplateId>country</credTemplateId>
<credTemplateId>religion</credTemplateId>
</privateOptionalCredentials>
<publicOptionalCredentials>
<credTemplateId>hobbies</credTemplateId>
</publicOptionalCredentials>
<genericPrincipals>
<principalRef name="admin" applicationName="isweb"/>
<principalRef name="customer" applicationName="anotherApplication"/>
</genericPrincipals>
<specificPrincipalFactories/>
</userTemplate>
<user>
<privateCredentials>
<credential>
<id>login</id>
<value>admin</value>
</credential>
<credential>
<id>password</id>
<value>admin</value>
</credential>
</privateCredentials>
<publicCredentials>
<credential>
<id>firstname</id>
<value>Rick</value>
</credential>
<credential>
<id>lastname</id>
<value>Dangerous</value>
</credential>
<credential>
<id>location</id>
<value>Paris</value>
</credential>
</publicCredentials>
<principalsRef>
<principalRef name="admin" applicationName="isweb" definition="${subject.publicCredentials.location.contains('Paris')}" active="true"/>
<principalRef name="customer" applicationName="anotherApplication" active="false" />
</principalsRef>
</user>
<user>
<privateCredentials>
<credential>
<id>login</id>
<value>guest</value>
</credential>
<credential>
<id>password</id>
<value>guest</value>
</credential>
</privateCredentials>
<publicCredentials/>
<principalsRef>
<principalRef name="guest" applicationName="isweb" />
</principalsRef>
</user>
</users>
</usersPrincipals>
jGuardAuthorization.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration SYSTEM "jGuardAuthorization_1.00.dtd">
<configuration>
<authorization>
<!-- 'local' or 'jvm' -->
<scope>local</scope>
<permissionResolutionCaching>true</permissionResolutionCaching>
<authorizationManager>net.sf.jguard.ext.authorization.manager.XmlAuthorizationManager</authorizationManager>
<authorizationManagerOptions>
<option>
<name>authorizationXmlFileLocation</name>
<value>WEB-INF/conf/jGuard/jGuardPrincipalsPermissions.xml</value>
</option>
<option>
<name>debug</name>
<value>true</value>
</option>
</authorizationManagerOptions>
</authorization>
</configuration>
jGuardPrincipalspermissions.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration SYSTEM "jGuardPrincipalsPermissions_1.00.dtd">
<configuration>
<permissions>
<domain>
<name>public</name>
<permission>
<name>accessDenied</name>
<class>net.sf.jguard.core.authorization.permissions.URLPermission</class>
<actions>
<action>/faces/pages/accessDenied.jsp</action>
<action>http</action>
<action>ressource where you are redirected when access to another ressource is denied</action>
</actions>
</permission>
<permission>
<name>authenticationFailed</name>
<class>net.sf.jguard.core.authorization.permissions.URLPermission</class>
<actions>
<action>/faces/pages/authenticationFailed.jsp</action>
<action>http</action>
<action>ressource where you are redirected when the authentication failed</action>
</actions>
</permission>
<permission>
<name>accueil</name>
<class>net.sf.jguard.core.authorization.permissions.URLPermission</class>
<actions>
<action>/faces/pages/registrationMenu.jsp</action>
</actions>
</permission>
<permission>
<name>changeActiveStatusOnRole</name>
<class>net.sf.jguard.core.authorization.permissions.URLPermission</class>
<actions>
<action>/User.do?method=setActiveOnRolePrincipal&*</action>
</actions>
</permission>
</domain>
<domain>
<name>vip</name>
<permission>
<name>allAccess</name>
<class>net.sf.jguard.core.authorization.permissions.URLPermission</class>
<actions>
<action>/*</action>
<action>full access to any ressource</action>
</actions>
</permission>
<!-- only use MBeanPermission if your jre is java 5 or higher
<permission>
<name>*</name>
<class>javax.management.MBeanPermission</class>
<actions>
<action>*</action>
</actions>
</permission> -->
<permission>
<name>dummy</name>
<class>net.sf.jguard.jee.extras.dwr1.DWR1Permission</class>
<actions>
<action>uk.ltd.getahead.dwr.create.NewCreator</action>
<action>net.sf.jguard.example.dwr.Dummy</action>
<action>getHello</action>
</actions>
</permission>
</domain>
</permissions>
<principals>
<principal>
<name>guest</name>
<class>net.sf.jguard.core.principals.RolePrincipal</class>
<permissionsRef>
<permissionRef name="accessDenied"/>
<permissionRef name="authenticationFailed"/>
<permissionRef name="accueil"/>
<permissionRef name="changeActiveStatusOnRole"/>
</permissionsRef>
</principal>
<principal>
<name>other</name>
<class>net.sf.jguard.core.principals.RolePrincipal</class>
<permissionsRef/>
</principal>
<principal>
<name>admin</name>
<class>net.sf.jguard.core.principals.RolePrincipal</class>
<permissionsRef>
<domainRef name="public"/>
<domainRef name="vip"/>
</permissionsRef>
<descendants>
<principalRef name="other"/>
</descendants>
</principal>
</principals>
</configuration>
Voilà en gros... J'ai également les jars suivants dans mon application, peut être qu'il m'en manque un...
antlr-2.7.6.jar
commons-beanutils.jar
commons-collections-2.1.1.jar
commons-digester.jar
commons-lang-2.3.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
htmLib.jar
jars.txt
jguard-core-1.0.3.jar
jguard-ext-1.0.3.jar
jguard-ext-java-5-1.0.3.jar
jguard-jee-1.0.3.jar
jguard-jee-extras-1.0.3.jar
jsf-api.jar
jsf-impl.jar
jstl.jar
jta.jar
log4j-1.2.11.jar
log4j-1.2.9.jar
standard.jar
tomahawk-1.1.3.jar
unifr-common-presentation.jar
J'ai encore une question concernant la connexion. L'action de la page de login, avec JSF, on peut mettre n'importe quoi, la seule contrainte est que l'action corresponde avec le <logonProcessURI> du fichier de configuration jGuardFilter.xml? L'action à proprement parler ne doit pas être codée, il n'a pas de serlvet ou quoi que ce soit derrière, j'ai bien compris?
Désolé de dire ça, mais c'est super urgent... Je ne dirais pas que ma vie en dépende, mais mon travail de diplôme un peu...
Merci beaucoup d'avance!
Neil.
Partager