2010-07-15 6 views
2

J'ai cette config dans mon components.xml:SEAM - get url de l'authentification base65

<web:authentication-filter url-pattern="/resource/rest/*" auth-type="basic"/> 
<security:identity authenticate-method="#{basicAuthenticator.login}"/> 

Eh bien, mon basicAuthenticator est un composant de couture Stateless où j'ai cette méthode de connexion qui renvoie true/false selon les informations d'identification .

Je veux vraiment trouver l'hôte (adresse url) de la demande.

Bien sûr, je peux utiliser ExternalContext comme:

@In(value = "#{facesContext.externalContext}", required = false) 
private ExternalContext externalContext; 

mais il me donne nulle parce que je n'ai pas jsf ici ...

Connaissez-vous une autre façon?

Merci.

+0

Jetez un oeil à http://stackoverflow.com/questions/2453746/jboss-seam-enabling-debug-page-on-weblogic-10-3-2-11g/2459795#2459795 Et assurez-vous que votre application est emballé correctement. –

+0

Vérifié mais il semble ok ... et le problème persiste .... :( –

Répondre

1

Cristian,

Parce que ServletFilter sera toujours appelée avant FacesServlet, vous obtiendrez toujours null.

donc ne pas utiliser

private @In FacesContext facesContext; 

plus lors de l'utilisation du filtre Servlet.

Solution: Eh bien, il ne peut pas être la meilleure solution, mais il résout ce que vous voulez faire

Créer une CustomAuthenticationFilter comme suit

@Scope(APPLICATION) 
@Name("org.jboss.seam.web.authenticationFilter") 
@Install(value = false, precedence = BUILT_IN) 
@BypassInterceptors 
@Filter(within = "org.jboss.seam.web.exceptionFilter") 
public class CustomAuthenticationFilter extends org.jboss.seam.web.AbstractFilter { 

    /** 
     * Because of some private methods defined in AuthenticationFilter 
     * do Ctrl + C/Ctrl + V All of source code of AuthenticationFilter 
     * 
     * Except authenticate method which is shown bellow 
     */ 

    private void authenticate(HttpServletRequest request, final String username) throws ServletException, IOException { 
     new ContextualHttpServletRequest(request) { 

      @Override 
      public void process() throws ServletException, IOException, LoginException { 
       Identity identity = Identity.instance(); 
       identity.getCredentials().setUsername(username); 

       try { 
        identity.preAuthenticate(); 

        /** 
         * Yes, THE SAME LOGIC performed by authenticate-method must goes here 
         */ 

        /** 
         * Do not use @In-jection here 
         * 
         * Use context lookup instead 
         * For instance, UserService userService = (UserService) Contexts.lookupInStatefulContexts("userService"); 
         */ 

        identity.postAuthenticate(); 
       } finally { 
        // Set password to null whether authentication is successful or not 
        identity.getCredentials.setPassword(null);  
       } 
      } 
     }.run(); 
    } 

} 

remplace maintenant par défaut AuthenticationFilter dans/WEB-INF /componets.xml

<web:rewrite-filter view-mapping="/resource/rest/*"/> 
<component name="org.jboss.seam.web.authenticationFilter" class="br.com.ar.seam.CustomAuthenticationFilter"> 
    <property name="urlPattern">/resource/rest/*</property> 
    <property name="authType">basic</property> 
</component> 

Et Pour activer restURL procédez comme suit

web.xml

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<!--HERE GOES NON-REST INTERCEPTED URL--> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.seam</url-pattern> 
</servlet-mapping> 
<!--HERE GOES REST INTERCEPTED URL--> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Maintenant, supposons que vous voulez appeler /ressources/repos/utilisateur qui servlet-mapping matchs restURL. Dans /WEB-INF/pages.xml déclare

<page view-id="<VIEW_ID_GOES_HERE>"> 
    <rewrite pattern="/resource/rest/user"/> 
    <rewrite pattern="/resource/rest/{userId}"/> 
    <!--userId comes from pattern shown above--> 
    <param name="userId" value="#{userService.userId}"/> 
</page> 

Pour éviter FacesServlet intercepter une des ressources côté client tels que les fichiers CSS, JAVASCRIPT et images, vous pouvez définir

<servlet> 
    <servlet-name>Seam Resource Servlet</servlet-name> 
    <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Seam Resource Servlet</servlet-name> 
    <url-pattern>/resource/*</url-pattern> 
</servlet-mapping> 

qui -t non applicable Cycle de vie JSF. Assurez-vous que place la servlet de ressource Seam au-dessus de la déclaration FacesServlet.

+0

Merci beaucoup Arthur.Votre solution en effet c'est parfait pour ce dont j'ai besoin! –