2012-06-25 22 views
5

Tôi đã thực hiện bảo mật mùa xuân để bảo vệ các phần của trang web của chúng tôi. Tôi đang sử dụng một DB (MongoDB) để lưu trữ tên người dùng/mật khẩu. Tôi đã triển khai org.springframework.security.core.userdetails.UserDetailsService để tra cứu chi tiết tài khoản từ DB.Bảo mật mùa xuân Đăng nhập với một twist: người dùng phải kích hoạt tài khoản của họ trước khi đăng nhập

Tôi vẫn cần phải thêm một tính năng khác: kích hoạt tài khoản. Sau khi đăng ký, chúng tôi gửi một email kích hoạt cho người dùng và nếu anh ta nhấp vào nó, chúng tôi đánh dấu tài khoản là đã kích hoạt trong DB. Người dùng chưa kích hoạt tài khoản của họ, không được phép đăng nhập và nên được chuyển hướng đến trang cho điều đó.

Bất kỳ ý tưởng nào về cách triển khai? Tôi cần phải bằng cách nào đó móc vào quá trình đăng nhập.

Cảm ơn!

Trả lời

9

Tuỳ chỉnh AuthenticationManager không cần thiết. Tính năng này đã có sẵn trong Spring Security. Hãy xem qua số doc, bạn có thể xem thuộc tính enabled. Khi bạn tạo người dùng, nếu bạn đặt thuộc tính đó thành false và người dùng cố đăng nhập, Spring sẽ tự động hiển thị một thông báo cho người dùng biết rằng tài khoản đó không hoạt động.

CẬP NHẬT

Để hiển thị thông báo lỗi mùa xuân, bạn nên sử dụng này trong trang đăng nhập:

<c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" /> 
+0

Vui mừng khi biết

+0

cảm ơn! câu trả lời chính xác! làm cách nào để tôi biết trong JSP rằng người dùng không được xác thực do tài khoản không được bật? – checklist

+0

Tôi đã cập nhật câu trả lời của mình. – jddsantaella

2

Bạn có thể tạo quản lý xác thực tùy chỉnh mà bạn có thể kiểm tra nếu người dùng được kích hoạt hay không

<bean id="authenticationFilter"  class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" 
     p:authenticationManager-ref="customAuthenticationManager" 
     p:authenticationFailureHandler-ref="customAuthenticationFailureHandler" 
     p:authenticationSuccessHandler-ref="customAuthenticationSuccessHandler" /> 

và tùy chỉnh authenticationManager

<bean id="customAuthenticationManager" 
     class="com.mycompany.security.CustomAuthenticationManager" /> 

CustomAuthenticationManager.java

public class CustomAuthenticationManager implements import org.springframework.security.authentication.AuthenticationManager{ 
     @Override 
    public Authentication authenticate(Authentication auth) 
      throws AuthenticationException { 

     User user = null; 
     if (auth.getName() == null) { 
      throw new BadCredentialsException("User does not exists!"); 
     } 
     user = userService.getUserByUsername(auth.getName()); 
     if (user == null) { 
      throw new BadCredentialsException("User does not exists!"); 
     } 
     if (passwordEncoder.isPasswordValid(user.getPassword(), (String) auth.getCredentials(), null)) { 
      //check if user is activated if not throw appropriate excetion 
     } else { 
      throw new BadCredentialsException("User does not exists!"); 
     } 

    } 

và nó sẽ chuyển hướng người dùng quay trở lại trang đăng nhập (nếu cấu hình đúng)

bây giờ trong login.jsp, lấy lý do thất bại của

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 

và hiển thị thông báo thích hợp để sử dụng }

+0

cảm ơn cho câu trả lời. Nhưng làm thế nào tôi sẽ chuyển hướng đến một trang khác sau đó? – checklist

+0

Đã thêm chi tiết –

+2

Custom AuthenticationManager là không cần thiết. "cho phép" tài sản từ UserDetails nên được sử dụng. – jddsantaella

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