2012-02-20 4 views
8

Câu hỏi đơn giản: cách tốt nhất để thêm thuộc tính (thuộc tính) vào HttpSession về xác thực thành công là gì? Ví dụ userID.Bảo mật mùa xuân: đặt thuộc tính bổ sung (thuộc tính) trong phiên thành công Xác thực

Đối với bây giờ tôi đang sử dụng thực hiện SimpleUrlAuthenticationSuccessHandler của riêng tôi trong UsernamePasswordAuthenticationFilter và làm nó như thế này:

public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication auth) 
      throws IOException, ServletException { 
     PersonBean person = (PersonBean) auth.getPrincipal(); 
     request.getSession().setAttribute("currentUserId", person .getId().toString()); 
     super.onAuthenticationSuccess(request, response, auth); 

Nhưng tôi không nghĩ rằng đây là cách tiếp cận tốt như có một cách để làm điều xác thực (Nhớ đến anh ví dụ) .

Vậy tôi cần sử dụng gì ở đây?

Trả lời

5

Câu trả lời đã được đưa ra trên diễn đàn mùa xuân. Link.

Nói chung, cần phải triển khai một ApplicationListener lắng nghe sự kiện succes và đặt các thuộc tính bổ sung trong phiên đó.

Nhưng trong trường hợp của tôi, không bắt buộc phải lưu trữ thuộc tính trong phiên. Tôi có thể truy xuất userID như ở đây:

var userId = ${pageContext.request.userPrincipal.principal.id} 
-1

Mùa xuân thực hiện tất cả điều này cho bạn, bạn sẽ phải tạo bảng * persistent_logins *, đây là đoạn trích từ ngữ cảnh ứng dụng có thể hữu ích. Và doc chính thức của lay describe in detail gì được yêu cầu:

<security:http auto-config='true'> 
    <security:intercept-url pattern="/**" access="ROLE_USER" /> 
    <security:form-login login-page="/Login" 
    authentication-success-handler-ref="authenticationSuccessHandler" 
    authentication-failure-url="/Login?login_error=1" /> 
    <security:remember-me data-source-ref="dataSource" 
    user-service-ref="myUserService" /> 
</security:http> 

và sau đó bạn có thể truy cập các đối tượng chủ yếu từ bất cứ nơi nào trong ứng dụng của bạn, ví dụ dưới đây cho thấy tag tên người dùng đầu ra trong jsp:

<sec:authentication property="principal.username" /> 

và từ mã java của bạn, điều này có thể được thực hiện:

MyUser user = (MyUser) authentication.getPrincipal(); 
+2

Bảng persistent_logins không thực sự liên quan đến việc lưu trữ thuộc tính trong phiên. Đó chỉ là một sự thực hiện nhớ-tôi đặc biệt. Mặc dù vậy, có nghĩa là lưu trữ các thuộc tính người dùng tùy chỉnh bổ sung trong đối tượng xác thực. –