2013-02-24 31 views
10

Tôi là người mới ở khung mùa xuân. Tôi đang tạo trang đăng nhập cho webapp của mình và tôi muốn người dùng đăng nhập trước bất kỳ hành động nào trên ứng dụng. Nếu người dùng nhập thông tin đăng nhập tốt, mọi thứ sẽ ổn và hoạt động, nhưng nếu nhập thông tin xấu, tôi muốn hiển thị thông báo và giữ tên người dùng trên phần tử nhập. Hiển thị thư không phải là vấn đề, nhưng tôi không thể giữ tên người dùng trong tệp jps của mình mà không sử dụng biến không được chấp nhận SPRING_SECURITY_LAST_USERNAME.Xác thực bảo mật mùa xuân: nhận tên người dùng mà không có SPRING_SECURITY_LAST_USERNAME

Hy vọng ai đó có thể giúp tôi, tôi đang sử dụng Spring 3.

CẬP NHẬT: yêu cầu nói Tôi không muốn hiển thị tên người dùng trên url.

Trả lời

22

Các tài liệu của hằng số NỮA nói chính xác những gì bạn nên làm:

/** 
* @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"; 

Something như thế này:

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

Trong cấu hình bảo mật của bạn:

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

Trong đăng nhập của bạn .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

Cảm ơn bạn rất nhiều! Nó hoạt động như cần thiết! – droidpl

+1

Không sao cả. Lưu ý rằng có không gian để cải thiện tại một số điểm. Ví dụ. mã hóa cứng tên của thuộc tính phiên trong tệp .jsp không phải là thanh lịch. Lý tưởng nhất là nó nên tham chiếu đến hằng số được định nghĩa trong 'UserNameCachingAuthenticationFailureHandler'. (Tôi phải thừa nhận tôi không biết làm thế nào để đạt được điều này.) – zagyi

+0

Tôi không biết điều này có thể đạt được! Nhưng bây giờ đó là tất cả những gì tôi cần, điều này không bảo mật đúng cách nhưng một mẹo nhỏ để làm cho cuộc sống của người dùng tốt hơn! Thật đáng kinh ngạc là tôi không thể tìm thấy một giải pháp đơn giản như thế này ở bất cứ đâu! ;) – droidpl

4

Nếu có ai đến đây đang gặp sự cố này trong bảo mật của Grails Spring. Bây giờ bạn có thể sử dụng như sau-

import grails.plugin.springsecurity.SpringSecurityUtils; 

Bây giờ sử dụng SpringSecurityUtils.SPRING_SECURITY_LAST_USERNAME_KEY điều này sẽ hoạt động và không được chấp nhận.

Các vấn đề liên quan