2013-06-10 4 views
6

Dopo il login con successo, non reindirizza a "index.php". Reindirizza la stessa pagina che è "login.php". C'è qualcosa di sbagliato nella mia pagina spring-security.xml?Reindirizzamento di sicurezza Spring dopo il login

Tra l'altro quando eseguo l'applicazione mi reindirizza a "login.php" che è buono. Ma non mostra i componenti primefaces ma i componenti html. Dopo aver eseguito correttamente il login, Reindirizza la stessa pagina ma questa volta mostra i componenti Primefaces invece dei componenti html.

<beans:beans xmlns="http://www.springframework.org/schema/security" 
     xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/pages/login.xhtml*" access="permitAll"/> 
    <intercept-url pattern="/**" access="hasRole('admin')" /> 
    <form-login login-page='/pages/login.xhtml' default-target-url="/pages/index.xhtml"      
       authentication-failure-url="/pages/login.xhtml"/> 
    <logout logout-success-url="/pages/logout.xhtml" /> 

</http> 
<!--Authentication Manager Details -->  
<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="customUserDetailsService"> 
<!--   <password-encoder hash="md5"/>--> 
    </authentication-provider> 
</authentication-manager> 

mio web.xml

<welcome-file-list> 
    <welcome-file>pages/index.xhtml</welcome-file> 
</welcome-file-list> 

mia pagina di login

<p:outputPanel id="loginOutputPanelId" style="border: navy"> 
         <p:panelGrid id="loginInformationPanel" columns="2"> 
          <h:outputText value="Username: "/> 
          <p:inputText value="#{loginController.userName}"/> 
          <h:outputText value="Password: "/> 
          <p:inputText value="#{loginController.password}"/> 
         </p:panelGrid> 
         <p:commandButton value="Login" actionListener="#{loginController.login()}"/> 
        </p:outputPanel> 

mia loginController.login() restituisce "Index" stringa e la mia faces.config;

<navigation-rule> 
     <from-view-id>/pages/login.xhtml</from-view-id> 
     <navigation-case> 
      <from-outcome>index</from-outcome> 
      <to-view-id>/pages/index.xhtml</to-view-id> 
      <redirect /> 
     </navigation-case> 
    </navigation-rule> 

EDIT: senza componente che gira senza alcun problema. Quando aggiungo form-login dice "La pagina web allo http://localhost:8080/myApplication/pages/login.xhtml ha comportato troppi reindirizzamenti". Metodo

<http auto-config='true' use-expressions="true"> 
<intercept-url pattern="/**" access="hasRole('admin')" /> 
<logout logout-success-url="/pages/logout.xhtml" /> 
<form-login login-page="/pages/login.xhtml" 
       login-processing-url="/j_spring_security_check"              
       default-target-url="/pages/index.xhtml"               
       authentication-failure-url="/pages/login.xhtml"/> 
</http> 

mia pagina di login

<p:outputPanel id="loginOutputPanelId" style="border: navy"> 
         <p:panelGrid id="loginInformationPanel" columns="2"> 
          <h:outputText value="Kullanıcı Adı: "/> 
          <p:inputText id="j_username" required="true" value="#{loginController.userName}"/> 
          <h:outputText value="Şifre: "/> 
          <p:inputText id="j_password" required="true" value="#{loginController.password}"/> 
         </p:panelGrid> 
         <p:commandButton id="login" type="submit" ajax="false" value="Login" actionListener="#{loginController.login()}"/> 
        </p:outputPanel> 

Il mio nuovo loginController.login();

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 

     RequestDispatcher dispatcher = ((ServletRequest) context.getRequest()) 
     .getRequestDispatcher("/j_spring_security_check"); 

     dispatcher.forward((ServletRequest) context.getRequest(), 
     (ServletResponse) context.getResponse()); 

     FacesContext.getCurrentInstance().responseComplete(); 

risposta

16

Per forzare la molla di sicurezza per andare a /pages/index.xhtml, è possibile utilizzare la proprietà always-use-default-target come questo:

<form-login login-page='/pages/login.xhtml' 
      default-target-url="/pages/index.xhtml" 
      always-use-default-target="true"      
      authentication-failure-url="/pages/login.xhtml"/> 

In caso contrario, la pagina di accesso dovrebbe essere mostrato automaticamente dalla sicurezza primavera, quando chiama un assicurato l'utente risorsa, e una volta effettuato l'accesso, continuare con la risorsa protetta che era stata originariamente richiesta.

Nel tuo caso, una certa confusione sembra provenire dal fatto che vuoi che la sicurezza di primavera gestisca il login e tu cerchi di gestirlo da solo con un jsf actionListener e le regole di navigazione.

inserendo "<form-login [...]" nella configurazione indica essenzialmente molla per attivare un filtro (UsernamePasswordAuthenticationFilter) che ascolterà le richieste effettuate a /j_spring_security_check. Se si desidera che spring gestisca l'accesso, per impostazione predefinita il login del modulo deve richiedere questo URL, passando due parametri: j_username e j_password.

In questo modo, la molla UsernamePasswordAuthenticationFilter si avvia e tenta di autenticare le credenziali fornite utilizzando UserDetailsService configurato in AuthenticationProvider.

Penso che sia necessario rimuovere il controller jsf per l'accesso e utilizzare spring-security per gestire l'autenticazione.

Spero che questo aiuti.

PS: assicurati che il tuo web.XML definisce il DelegatingFilterProxy prima di tutti gli altri filtri servlet:

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

Ancora stesso. Non cambia nulla. –

+0

qual è il primo URL che chiami? Chiamate direttamente la pagina di accesso o chiamate un altro URL protetto? – baraber

+0

index.xhtml è il mio file di benvenuto definito in "web.xml". Non capisco cosa intendi. C'è login-page = '/ pages/login.xhtml' su spring-security.xml e spring security prima chiama login.xhtml. dopo aver aggiunto sempre-use-default-target = "true", ora non reindirizza alcuna pagina. Rimane nella pagina login.xhtml. Quindi scrivo manualmente l'indirizzo dell'indice per indirizzare la barra del browser. –

0

Abilita le 'Faces Servlet' formato URL in web.xml. Se contiene JSF piace:

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
</servlet-mapping> 

allora è necessario aggiornare il codice in primavera-security.xml piace:

<form-login login-page="/pages/login.jsf" 
       login-processing-url="/j_spring_security_check"              
       default-target-url="/pages/index.jsf"               
       authentication-failure-url="/pages/login.jsf"/> 
Problemi correlati