2013-06-10 6 views
6

सफल लॉगिन के बाद, यह "index.php" पर रीडायरेक्ट नहीं करता है। यह उसी पृष्ठ को रीडायरेक्ट करता है जो "login.php" है। क्या मेरे वसंत-सुरक्षा.एक्सएमएल पेज में कुछ गड़बड़ है?लॉगिन के बाद स्प्रिंग सुरक्षा पुनर्निर्देशन

जिस तरह से मैं एप्लिकेशन चलाता हूं, यह मुझे "login.php" पर रीडायरेक्ट करता है जो कि अच्छा है। लेकिन यह प्राइमफेस घटकों को नहीं दिखाता है लेकिन एचटीएमएल घटक। सफलतापूर्वक लॉगिन करने के बाद, यह उसी पृष्ठ को रीडायरेक्ट करता है लेकिन इस बार यह 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> 

मेरे web.xml

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

अपना लॉगिन पेज

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

मेरी loginController.login() विधि रिटर्न "अनुक्रमणिका" स्ट्रिंग और मेरे 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> 

संपादित करें: घटक के बिना यह किसी भी समस्या के बिना चलाता है। जब मैं फॉर्म-लॉगिन जोड़ता हूं तो यह कहता है "http://localhost:8080/myApplication/pages/login.xhtml पर वेबपृष्ठ के परिणामस्वरूप बहुत सारे रीडायरेक्ट हुए हैं"।

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

मेरे प्रवेश पृष्ठ

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

मेरा नया 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(); 

उत्तर

16

/pages/index.xhtml पर जाने के लिए वसंत-सुरक्षा के लिए मजबूर करने के लिए, तो आप इस रूप में संपत्ति always-use-default-target उपयोग कर सकते हैं:

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

अन्यथा, प्रवेश पृष्ठ जब उपयोगकर्ता एक सुरक्षित कॉल वसंत सुरक्षा द्वारा स्वचालित रूप से दिखाया जाना चाहिए संसाधन, और एक बार लॉगिन करने के बाद, उस सुरक्षित संसाधन को जारी रखें जिसे मूल रूप से पूछा गया था।

आपके मामले में, कुछ भ्रम इस तथ्य से आते हैं कि आप वसंत सुरक्षा को लॉगिन को संभालने के लिए चाहते हैं, और आप स्वयं को जेएसएफ एक्शन लिस्टनर और नेविगेशन नियमों के साथ संभालने का प्रयास करते हैं।

कॉन्फ़िगरेशन में "<form-login [...]" डालने से अनिवार्य रूप से वसंत को फ़िल्टर (UsernamePasswordAuthenticationFilter) सक्रिय करने के लिए कहा जाता है जो /j_spring_security_check पर किए गए अनुरोधों को सुनेंगे। यदि आप वसंत को लॉगिन संभालना चाहते हैं, तो डिफ़ॉल्ट रूप से आपके फॉर्म लॉगिन को दो पैरामीटर पारित करने के लिए इस यूआरएल का अनुरोध करना होगा: j_username और j_password

इस तरह, वसंत का UsernamePasswordAuthenticationFilter आपके प्रमाणीकरण प्रदाता में कॉन्फ़िगर किए गए UserDetailsService का उपयोग करके प्रदान किए गए प्रमाण-पत्रों को प्रमाणित करने का प्रयास करेगा।

मुझे लगता है कि आपको लॉगिन के लिए अपने जेएसएफ नियंत्रक को हटाना होगा और प्रमाणीकरण को संभालने के लिए वसंत-सुरक्षा का उपयोग करना होगा।

उम्मीद है कि इससे मदद मिलती है।

पीएस: सुनिश्चित करें कि आपका वेब।एक्सएमएल अन्य सभी सर्वलेट फिल्टर से पहले DelegatingFilterProxy परिभाषित करता है:

<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

फिर भी एक ही। यह कुछ भी नहीं बदलता है। –

+0

आप किस यूआरएल को कॉल करते हैं? क्या आप सीधे लॉगिन पेज पर कॉल करते हैं या आप किसी अन्य सुरक्षित यूआरएल को कॉल करते हैं? – baraber

+0

index.xhtml मेरी स्वागत फ़ाइल "web.xml" में परिभाषित है। मुझे समझ में नहीं आता कि आपका क्या मतलब है। Spring-security.xml पर लॉगिन-पृष्ठ = '/ pages/login.xhtml' है और वसंत सुरक्षा पहले login.xhtml को कॉल करती है। जब मैं हमेशा-उपयोग-डिफ़ॉल्ट-लक्ष्य = "सत्य" पंक्ति जोड़ता हूं, तो अब यह किसी भी पृष्ठ को रीडायरेक्ट नहीं करता है। यह login.xhtml पेज पर रहता है। फिर मैं ब्राउजर के बार को संबोधित करने के लिए मैन्युअल रूप से इंडेक्स एड्रेस लिखता हूं। –

0

कृपया जांच करें अपने web.xml में URL प्रतिमान 'सर्वलेट चेहरे'। यदि यह होता है .jsf चाहते:

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

तो आप में अपने कोड अपडेट करना होगा वसंत-security.xml चाहते:

<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"/> 
संबंधित मुद्दे