2013-02-24 23 views
10

के बिना उपयोगकर्ता नाम प्राप्त करें मैं वसंत ढांचे पर नया हूं। मैं अपने वेबपैप के लिए एक लॉगिन पेज बना रहा हूं और मैं चाहता हूं कि उपयोगकर्ता ऐप पर किसी भी कार्रवाई से पहले लॉगिन करे। यदि उपयोगकर्ता अच्छे प्रमाण-पत्र में प्रवेश करता है तो यह ठीक है और काम कर रहा है, लेकिन यदि बुरे लोगों में प्रवेश करता है तो मैं एक संदेश प्रदर्शित करना चाहता हूं और उपयोगकर्ता नाम इनपुट तत्व पर रखना चाहता हूं। संदेश प्रदर्शित करना कोई समस्या नहीं है, लेकिन मैं बहिष्कृत चर SPRING_SECURITY_LAST_USERNAME का उपयोग किये बिना उपयोगकर्ता को मेरी जेपीएस फ़ाइल में रखने में सक्षम नहीं हूं।स्प्रिंग सुरक्षा प्रमाणीकरण: बिना SPRING_SECURITY_LAST_USERNAME

आशा कोई मुझे मदद, मैं वसंत का उपयोग कर रहा 3.

अद्यतन कर सकते हैं: आवश्यकताओं कहता है कि मैं यूआरएल पर उपयोगकर्ता नाम प्रदर्शित नहीं करना चाहते।

उत्तर

22

पदावनत निरंतर के प्रलेखन वास्तव में आपको बताता है कि क्या करना चाहिए:

/** 
* @deprecated If you want to retain the username, cache it in a customized {@code AuthenticationFailureHandler} 
*/ 
@Deprecated 
public static final String SPRING_SECURITY_LAST_USERNAME_KEY = 
      "SPRING_SECURITY_LAST_USERNAME"; 

कुछ इस तरह:

public class UserNameCachingAuthenticationFailureHandler 
    extends SimpleUrlAuthenticationFailureHandler { 

    public static final String LAST_USERNAME_KEY = "LAST_USERNAME"; 

    @Autowired 
    private UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter; 

    @Override 
    public void onAuthenticationFailure(
      HttpServletRequest request, HttpServletResponse response, 
      AuthenticationException exception) 
      throws IOException, ServletException { 

     super.onAuthenticationFailure(request, response, exception); 

     String usernameParameter = 
      usernamePasswordAuthenticationFilter.getUsernameParameter(); 
     String lastUserName = request.getParameter(usernameParameter); 

     HttpSession session = request.getSession(false); 
     if (session != null || isAllowSessionCreation()) { 
      request.getSession().setAttribute(LAST_USERNAME_KEY, lastUserName); 
     } 
    } 
} 

अपनी सुरक्षा config में:

<security:http ...> 
    ... 
    <security:form-login 
     authentication-failure-handler-ref="userNameCachingAuthenticationFailureHandler" 
    ... 
    /> 
</security:http> 

<bean 
    id="userNameCachingAuthenticationFailureHandler" 
    class="so.UserNameCachingAuthenticationFailureHandler"> 
    <property name="defaultFailureUrl" value="/url/to/login?error=true"/> 
</bean> 

अपनी प्रवेश में .jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page session="true" %> 

... 

<%--in the login form definition--%> 
<input id="j_username" name="j_username" type="text" 
    value="<c:out value="${sessionScope.LAST_USERNAME}"/>"/> 
+0

आपको बहुत बहुत धन्यवाद! यह आवश्यक की तरह काम करता है! – droidpl

+1

कोई समस्या नहीं है। ध्यान दें कि कुछ बिंदुओं पर सुधार के लिए जगह है। जैसे .jsp में सत्र विशेषता का नाम हार्ड कोडिंग सुरुचिपूर्ण नहीं है। आदर्श रूप से इसे 'UserNameCachingAuthenticationFailureHandler' में निरंतर परिभाषित किया जाना चाहिए। (मुझे यह स्वीकार करना है कि मुझे नहीं पता कि इस संकेत को कैसे प्राप्त किया जाए।) – zagyi

+0

मुझे नहीं पता था कि यह हासिल किया जा सकता है! लेकिन अभी के लिए मुझे बस इतना ही चाहिए, यह सुरक्षा ठीक से नहीं बल्कि उपयोगकर्ता के जीवन को बेहतर बनाने के लिए एक छोटी सी चाल है! यह अविश्वसनीय है कि मुझे इस तरह कहीं और आसान समाधान नहीं मिला! ;) – droidpl

4

यदि कोई यहां आता है जो Grails स्प्रिंग सुरक्षा में इस समस्या का सामना कर रहा है। अब आप का उपयोग following-

import grails.plugin.springsecurity.SpringSecurityUtils; 

अब SpringSecurityUtils.SPRING_SECURITY_LAST_USERNAME_KEY इस काम करेंगे और पदावनत नहीं है का उपयोग कर सकते हैं।

संबंधित मुद्दे