2012-11-14 23 views
5

जब मैं स्प्रिंग सिक्योरिटी के साथ एक कस्टम लॉगिन फॉर्म का उपयोग करने का प्रयास करता हूं तो यह मुझे सही क्रेडेंशियल दर्ज करता है या नहीं, इस पर ध्यान दिए बिना मुझे/व्यवस्थापक/लॉगिन पेज पर लौटता रहता है। जब मैं खाली <form-login /> का उपयोग करता हूं तो सुरक्षा जांच ठीक काम करती है। लेकिन जैसे ही मैं एक कस्टम <form-login login-page="/admin/login" /> जोड़ता हूं, मैं उसी पृष्ठ पर लौट रहा हूं। मैंने default-target-url="admin/forSale" /> जोड़ने का प्रयास किया है लेकिन मैं अभी भी लॉगिन पेज पर वापस आ गया हूं। सही क्रेडेंशियल्स प्रदान करने और लॉगिन पेज पर लौटने के बाद मैं एक सुरक्षित यूआरएल तक पहुंचने का प्रयास करता हूं और मुझे फिर से लॉगिन पेज पर वापस कर दिया जाता है, इसलिए मुझे 99% यकीन है कि सुरक्षा जांच बिल्कुल नहीं की गई थी।स्प्रिंग सिक्योरिटी 3.1

action="<c:url value='j_spring_security_check' />" मेरे जेएसपी में http://localhost:8080/sharleepark/admin/j_spring_security_check पर यूआरएल बनाता है। मुझे लगता है कि फिल्टर अभी भी इसे उठाएगा और तदनुसार सुरक्षा को संसाधित करेगा?

मुझे विश्वास है कि मेरे नियंत्रक या जेएसपी में एक साधारण गलती है जिसे मैं उठा नहीं रहा हूं। मैं टाइल्स 2 टेम्पलेटिंग का भी उपयोग कर रहा हूं, क्या यह समस्या का हिस्सा हो सकता है? मैंने इस पर कुछ दिन बिताए हैं और सभी वसंत सुरक्षा ट्यूटोरियल की कोशिश की है जो मुझे आपकी सहायता के लिए अग्रिम धन्यवाद का कोई फायदा नहीं हुआ है।

वसंत-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> 

    <!-- Scans packages to auto declare the beans we require --> 
    <context:component-scan base-package="au.com.sharleepark.controller" /> 
    <context:component-scan base-package="au.com.sharleepark.service" /> 
    <context:component-scan base-package="au.com.sharleepark.hibernate" /> 
    <context:component-scan base-package="au.com.sharleepark.helper" /> 

    <mvc:annotation-driven /> 
    <tx:annotation-driven /> 

    <!-- Map our static resources to a friendly URL --> 
    <mvc:resources location="/static/" mapping="/static/**" /> 

    <!-- Specify the view resolver that we wish to use --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
    </bean> 

    <!-- Tell the tiles configurator where our tiles configuration files are located --> 
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
        <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean> 

    <!-- Our datasource --> 
    <!-- Defines our connection to the database --> 
    <bean id="dataSource" 
    class="org.springframework.jdbc.datasource.SingleConnectionDataSource" 
    destroy-method="destroy"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://blah blah" /> 
     <property name="username" value="" /> 
     <property name="password" value="" /> 
     <property name="suppressClose" value="true" /> 
     <property name="autoCommit" value="true" /> 
    </bean> 

    <!-- Session Factory --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="au.com.sharleepark.domain" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">validate</prop> 
       <prop key="show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <!-- Data Access Objects --> 
    <!-- <bean id="hibernateDAO" class="au.com.sharleepark.hibernate.HibernateDaoImpl"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> --> 

    <!-- Transaction management --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- Spring exception translation post processor for the DAO layer --> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

</beans> 

वसंत-security.xml

<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.0.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <http pattern="/static/**" security="none" /> 

    <http use-expressions="true"> 
     <intercept-url pattern="/admin/login" access="permitAll" /> 
     <intercept-url pattern="/admin/**" access="isAuthenticated()" /> 
     <intercept-url pattern="/**" access="permitAll" /> 
     <form-login login-page="/admin/login" /> 
     <logout /> <!-- Not there is currently a logout link anyway --> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <user-service> 
       <user name="rod" password="koala" authorities="supervisor, teller, user" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0" metadata-complete="true"> 

    <display-name>Sharlee Park</display-name> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/spring-security.xml 
      /WEB-INF/spring-servlet.xml 
     </param-value> 
    </context-param> 

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

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

adminLoginController.java (नियंत्रक)

package au.com.sharleepark.controller.admin; 

import org.apache.log4j.Logger; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 

/** 
* Controller class for the administration login 
* @author Steve 
* @version 1.00 
* 
* Change History 
* 08/11/12 - Created 
*/ 
@Controller 
@RequestMapping(value="admin") 
public class AdminLoginController { 

    private static final Logger logger = Logger.getLogger(AdminLoginController.class); 

    @RequestMapping(value="/login") 
    public ModelAndView doView(@RequestParam(value="error", required=false) boolean error) { 
     logger.info("processing Login"); 

     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("admin/login"); 

     if (error) { 
      logger.error("Invalid Credentials"); 
      mav.addObject("error", "Invalid login credentials"); 
     } 
     return mav; 
    } 
} 

adminLogin.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<div id="login"> 
    <div id="loginContent"> 
     <div class="error">${error}</div> 
     <form name='sharleeParkLoginForm' action="<c:url value='j_spring_security_check' />" method='POST'> 
      <fieldset> 
       <ul class="fieldUL"> 
        <li> 
         <label class="inputLabel" for="j_username">Username</label> 
         <span> 
          <input class="inputField" type="text" tabindex="1" id="j_username" name="j_username" size="25" maxlength="25"> 
         </span> 
        </li> 
       </ul> 
       <ul class="fieldUL"> 
        <li> 
         <label class="inputLabel" for="spPassword">Password</label> 
         <span> 
          <input class="inputField" type="password" tabindex="2" id="j_password" name="j_password" size="25" maxlength="25"> 
         </span> 
        </li> 
       </ul> 
       <ul class="fieldUL"> 
        <li><input name="submit" type="submit" value="Login"></li> 
       </ul> 
      </fieldset> 
     </form> 
     </div> 
</div> 

tiles.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE tiles-definitions PUBLIC 
    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" 
    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"> 

<tiles-definitions> 
    <definition name="base.definition" template="/WEB-INF/jsp/layout.jsp"> 
     <put-attribute name="title" value="" /> 
     <put-attribute name="header" value="/WEB-INF/jsp/header.jsp" /> 
     <put-attribute name="body" value="" /> 
    </definition> 

.... 

    <!-- ADMIN PAGES --> 
    <definition name="admin/login" extends="base.definition"> 
     <put-attribute name="title" value="Administration Login" /> 
     <put-attribute name="body" value="/WEB-INF/jsp/admin/adminLogin.jsp" /> 
    </definition> 
.... 

</tiles-definitions> 

उत्तर

0

मैंने इसे काम किया है। समस्या का समाधान login-processing-url="/admin/j_spring_security_check" विशेषता <form-login> टैग में विशेषता को जोड़ रहा था। मैंने पहले स्प्रिंग सिक्योरिटी के साथ काम नहीं किया है और मुझे लगता है कि मैंने अभी माना है कि फ़िल्टर जादुई रूप से j_spring_security_check पाएंगे और तदनुसार प्रक्रिया करेंगे। हो सकता है कि फिल्टर j_spring_security_check रूट यूआरआई (यानी/sharleepark/j_spring_security_check) से है, तो फ़िल्टर इसे उठाते हैं? मैंने कभी भी देखे गए किसी भी ट्यूटोरियल में निर्दिष्ट होने के लिए login-processing-url की आवश्यकता को कभी नहीं देखा है। फिर से उनके इनपुट के लिए सभी को धन्यवाद।

+1

नीचे वोट? माना जाता है कि मैं वसंत सुरक्षा के लिए बहुत नया था लेकिन यदि आप वोट नीचे जा रहे हैं तो कृपया मुझे टिप्पणी करें और अन्य लाभ उठा सकते हैं। – DecafCoder

0

मुझे यकीन है कुछ अपनी सुरक्षा विन्यास के साथ गलत है।

आप अपने http घोषणा में उपयोग-अभिव्यक्ति = "सत्य" का उपयोग क्यों कर रहे हैं? मुझे नहीं लगता कि आप स्प्रिंग-ईएल अभिव्यक्तियों का उपयोग करते हैं ... इसे हटाने का प्रयास करें और देखें कि कुछ बदलता है या नहीं।

+0

जहां तक ​​मुझे पता है (और [लिंक] के अनुसार (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html)) आपको आवश्यकता है 'permitAll' और 'प्रमाणीकृत()' का उपयोग करने के लिए उपयोग-अभिव्यक्तियां? वैसे भी मैंने 'उपयोग-अभिव्यक्ति' को हटाने का प्रयास किया और मुझे एक 'java.lang.IllegalArgumentException: असमर्थित कॉन्फ़िगरेशन विशेषताएँ: [permitAll, प्रमाणीकृत(), कोई नहीं]' इसलिए यह आवश्यक होना चाहिए। मेरी सभी सुरक्षा कॉन्फ़िगरेशन पोस्ट की गई है, इसलिए यदि यह कॉन्फ़िगर में है तो यह ऊपर कुछ है। – DecafCoder

+0

आप यहां देख सकते हैं http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e5432 जो अनुमति देता है सभी और प्रमाणीकृत() अंतर्निहित अभिव्यक्तियां हैं ... वैसे भी, केवल परीक्षण के लिए, उपयोग-अभिव्यक्ति = "सत्य" से छुटकारा पाएं और पहुंच = "ROLE_USER" का उपयोग करने का प्रयास करें और देखें कि क्या परिवर्तन है – OhadR

+0

'उपयोग-अभिव्यक्ति' अभी भी अभिव्यक्तियों में निर्मित उपयोग करने के लिए आवश्यक है। मैंने 'उपयोग-अभिव्यक्ति' के लिए और बिना आपके सुझावों का प्रयास किया है अवैध अवैध प्रयासों को फेंक दिया गया है, इसलिए दुर्भाग्य से मुझे नहीं लगता कि यह – DecafCoder

8

<http auto-config="true" use-expressions="true"> का उपयोग करने का प्रयास करें।

प्रलेखन से के बारे में httpauto-config विशेषता:

स्वचालित रूप से एक लॉगिन फार्म, मूल प्रमाणीकरण, अनाम प्रमाणन, लॉगआउट सेवाओं, याद-मेरे और सर्वलेट-api-एकीकरण पंजीकृत करता है। यदि "सत्य" पर सेट किया गया है, तो इन सभी क्षमताओं को जोड़ा जाता है (हालांकि आप संबंधित तत्व प्रदान करके प्रत्येक की कॉन्फ़िगरेशन को अभी भी अनुकूलित कर सकते हैं)। यदि निर्दिष्ट नहीं है, तो "झूठी" पर डिफ़ॉल्ट है।

+0

क्षमा करें मुझे यह उल्लेख करना चाहिए था कि मैंने 'auto-config = "true"' भी कोशिश की थी। दुर्भाग्य से यह मुझे लॉगिन पेज पर लौटने से नहीं रोकता है। – DecafCoder

0

आम तौर पर हम नियंत्रक में /login मैपिंग को संभाल नहीं पाते हैं। वसंत सुरक्षा लॉगिन प्रमाणीकरण को संभालती है और सफलता यूआरएल को निर्देशित करती है। आप इस तरह वसंत-config.xml में लॉगिन पेज के लिए दृश्य नाम निर्दिष्ट कर सकते हैं ..

<mvc:view-controller path="/login" view-name="login"/> 

और आप नियंत्रक वर्ग में सफलता यूआरएल मैपिंग को संभाल सकते हैं। इस मामले में यदि आप default-target-url="admin/forSale" निर्दिष्ट करते हैं तो /forSale मैपिंग को संभालने के लिए एक विधि लिखें।

मुझे लगता है कि becaue आप नियंत्रक अपने दोनों सफलता और विफलता के लिए लॉगिन पृष्ठ पर निर्देशित कर में '/ लॉगिन' मानचित्रण संभाल रहे हैं ..

ModelAndView mav = new ModelAndView(); 
mav.setViewName("admin/login"); 

लेकिन बजाय अगर वहाँ तो कोई त्रुटि दृश्य है अलग होना चाहिए mav.setViewName("admin/forSale")

+0

धन्यवाद, मैंने सोचा कि यह ठीक करेगा क्योंकि मुझे लगता है कि यह नियंत्रक मानचित्रण के साथ कुछ करना था। मैंने पहले चित्र से नियंत्रक को हटाने का प्रयास किया था, लेकिन मुझे नहीं पता था कि आप '' का उपयोग कर सकते हैं, इसलिए इस बार मैंने ' जोड़ा 'लेकिन यह अभी भी काम नहीं किया। मैं सुरक्षा प्रसंस्करण से कोई लॉगिंग नहीं कर पा रहा हूं, इसलिए मैं कुछ लॉगिंग में जोड़ने के लिए एक त्वरित फ़िल्टर लिख रहा हूं ताकि क्या हो रहा है, इसकी बेहतर समझ प्राप्त हो सके। उम्मीद है कि स्थिति पर कुछ और प्रकाश डालेगा। – DecafCoder