2013-06-10 16 views
6

Po pomyślnym zalogowaniu, nie przekierowuje do "index.php". Przekierowuje tę samą stronę, która jest "login.php". Czy jest coś złego na mojej stronie spring-security.xml?Przekierowanie zabezpieczeń wiosennych po zalogowaniu

Nawiasem mówiąc, po uruchomieniu aplikacji przekierowuje mnie do "login.php", co jest dobre. Ale nie pokazuje składników primefaces, ale komponenty html. Po pomyślnym zalogowaniu się, przekierowuje tę samą stronę, ale tym razem pokazuje komponenty Primefaces zamiast komponentów 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> 

moim web.xml

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

moja strona logowania

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

mój loginController.login() zwraca metoda "Indeks" string i mój 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: bez komponentu przebiega bez problemu. Po dodaniu logowania do formularza jest napisane: "Strona internetowa o numerze http://localhost:8080/myApplication/pages/login.xhtml spowodowała zbyt wiele przekierowań". Metoda

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

Moja strona logowania

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

Mój nowy 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(); 

Odpowiedz

16

Aby wymusić wiosna-Security, aby przejść do /pages/index.xhtml, można użyć własności always-use-default-target jak to:

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

przeciwnym razie strona logowania powinien być pokazany automatycznie przez system zabezpieczeń wiosny, kiedy zwraca użytkownikowi zabezpieczone zasobów, a po zalogowaniu się, przejdź do zabezpieczonego zasobu, o który pierwotnie go poprosiono.

W twoim przypadku pewne zamieszanie zdaje się wynikać z faktu, że chcesz, aby bezpieczeństwo wiosenne obsługiwało logowanie, i próbujesz poradzić sobie z nim za pomocą jsf actionListener i reguł nawigacyjnych.

Wstawienie "<form-login [...]" w konfiguracji zasadniczo mówi sprężynie, aby aktywować filtr (UsernamePasswordAuthenticationFilter), który będzie nasłuchiwał żądań wysłanych pod numer /j_spring_security_check. Jeśli chcesz, aby logowanie obsługiwało logowanie, domyślnie Twój login formularza musi żądać tego adresu URL, przekazując dwa parametry: j_username i j_password.

W ten sposób uruchomi się wiosna UsernamePasswordAuthenticationFilter i spróbuje uwierzytelnić podane poświadczenia za pomocą usługi UserDetails skonfigurowanej w usłudze uwierzytelniania.

Myślę, że musisz usunąć kontroler jsf w celu zalogowania się i użyć funkcji spring-security do obsługi uwierzytelniania.

Mam nadzieję, że to pomoże.

PS: upewnij się, że Twoja sieć.xml definiuje DelegatingFilterProxy przed wszystkimi innymi filtrów serwletów:

<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

nadal ten sam. Nic nie zmienia. –

+0

jaki jest twój pierwszy URL? Czy dzwonisz bezpośrednio na stronę logowania, czy dzwonisz pod inny zabezpieczony URL? – baraber

+0

index.xhtml to plik powitalny zdefiniowany w "web.xml". Nie rozumiem, co masz na myśli. Istnieje login-page = '/ pages/login.xhtml' na stronie spring-security.xml i spring security first calls login.xhtml. po dodaniu linii always-use-default-target = "true", teraz nie przekierowuje żadnej strony. Pozostaje na stronie login.xhtml. Następnie ręcznie wpisuję adres indeksu do paska adresu przeglądarki. –

0

Proszę sprawdzić 'Faces Servlet' wzorzec adresów URL w web.xml. Jeśli zawiera .jsf lubię:

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

następnie należy zaktualizować swój kod na wiosnę-security.xml lubię:

<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"/> 
Powiązane problemy