2013-06-10 9 views
6

Nach erfolgreicher Anmeldung leitet es nicht zu "index.php" um. Es leitet die gleiche Seite um, die "login.php" ist. Ist etwas mit meiner Seite spring-security.xml nicht in Ordnung?Spring Sicherheitsumleitung nach dem Login

Nebenbei, wenn ich die Anwendung ausführen, leitet es mich zu "login.php" um, was gut ist. Aber es zeigt nicht Hauptbestandteile, sondern HTML-Komponenten. Nachdem ich mich erfolgreich angemeldet habe, leitet es die gleiche Seite um, aber dieses Mal zeigt es Primefaces-Komponenten anstelle von HTML-Komponenten.

<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> 

meine web.xml

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

Anmeldungsseite

<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> 

meine loginController.login() Methode gibt "index" String und meine 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: ohne Komponente läuft es ohne Probleme. Wenn ich Formular-Login hinzufüge, heißt es "Die Webseite unter http://localhost:8080/myApplication/pages/login.xhtml hat zu viele Redirects geführt".

<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> 

Meine Login-Seite

<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> 

Mein neues loginController.login() -Methode;

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(); 

Antwort

16

Um feder Sicherheit zu zwingen /pages/index.xhtml zu gehen, Sie Eigenschaft always-use-default-target wie diese verwenden:

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

Andernfalls sollte die Login-Seite automatisch durch Feder Sicherheit angezeigt werden, wenn der Benutzer einer gesicherten ruft Ressource, und sobald die Anmeldung abgeschlossen ist, fahren Sie mit der gesicherten Ressource fort, nach der sie ursprünglich gefragt wurde.

In Ihrem Fall scheint etwas Verwirrung von der Tatsache zu kommen, dass Sie möchten, dass die Federsicherheit die Anmeldung behandelt, und Sie versuchen, sie selbst mit einem jsf actionListener und Navigationsregeln zu behandeln.

Putting "<form-login [...]" in der Konfiguration im Wesentlichen sagt Frühjahr einen Filter (UsernamePasswordAuthenticationFilter) zu aktivieren, die Anfragen zu /j_spring_security_check zu hören. Wenn Sie möchten, dass Spring die Anmeldung durchführt, muss Ihre Formularanmeldung standardmäßig diese URL anfordern und zwei Parameter übergeben: j_username und j_password.

Auf diese Weise wird der Frühling UsernamePasswordAuthenticationFilter treten und versuchen, die angegebenen Anmeldeinformationen mit dem UserDetailsService zu authentifizieren, den Sie in Ihrem AuthenticationProvider konfiguriert haben.

Ich denke, Sie müssen Ihre jsf-Controller für die Anmeldung entfernen und Feder-Sicherheit verwenden, um die Authentifizierung zu behandeln.

Hoffe, das hilft.

PS: Stellen Sie sicher, dass Ihr Web.xml definiert die DelegatingFilterProxy vor allen anderen Servlet-Filter:

<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

noch gleich. Es ändert nichts. –

+0

Wie lautet die erste URL, die Sie anrufen? Rufen Sie direkt die Login-Seite an oder rufen Sie eine andere gesicherte URL an? – baraber

+0

index.xhtml ist meine Willkommensdatei, die in "web.xml" definiert ist. Ich verstehe nicht, was du meinst. Es gibt die Login-Seite = '/ pages/login.xhtml' in der Datei spring-security.xml und die Spring-Sicherheit ruft zuerst login.xhtml auf. nachdem ich die Zeile "always-use-default-target =" true "hinzugefügt habe, wird nun keine Seite umgeleitet. Es bleibt auf der login.xhtml Seite. Dann schreibe ich die Indexadresse manuell in die Adressleiste des Browsers. –

0

Bitte überprüfen Sie Ihre 'Faces Servlet' URL-Muster in web.xml. Wenn es enthält .jsf mag:

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

dann müssen Sie Ihren Code in aktualisieren feder security.xml mag:

<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"/> 
Verwandte Themen