2013-07-03 9 views
9

Tôi có thể hiển thị SPRING_SECURITY_LAST_EXCEPTION.message ("Bad Credentials") khi người dùng cố gắng đăng nhập bằng thông tin đăng nhập hoặc người dùng không chính xác bị vô hiệu vì một lý do nào đó.Bảo mật mùa xuân: Thông báo ngoại lệ tùy chỉnh từ UserDetailsService

Tôi muốn hiển thị thông báo tùy chỉnh cho trường hợp người dùng bị vô hiệu hóa, không hiển thị "Thông tin đăng nhập không hợp lệ" thay vì nói "Bạn đã bị vô hiệu ... blah, blah ...". Làm thế nào để làm điều đó?

Tôi đang sử dụng UserDetailsService để cung cấp tên người dùng/mật khẩu trong bảo mật mùa xuân.

+0

Bạn đã thử phương pháp được mô tả trong http://stackoverflow.com/questions/1373407/how-to-display-custom-error-message-in-jsp-for-spring-security-auth- ngoại lệ ? – Jk1

+0

Nó hoạt động, một phần. Tuy nhiên, tôi có thể nhận được các thông báo tùy chỉnh, nó luôn trả về thông điệp được cấu hình cho AbstractUserDetailsAuthenticationProvider.badCredentials. Mặc dù tôi ném DisabledException, tôi nhận được cùng một thông báo như được định nghĩa cho badCredentials trong trang jsp của tôi – Jayz

+0

Vui lòng giải thích phiên bản bạn đang sử dụng, nơi bạn đang ném ngoại lệ và nơi bạn đang hiển thị thông báo. Nó có lẽ là tốt nhất nếu bạn đăng cấu hình bảo mật web thực tế mà bạn đang sử dụng. –

Trả lời

9

Bạn cần đặt thuộc tính hideUserNotFoundExceptions là AbstractUserDetailsAuthenticationProvider thành sai. (Điều này có nghĩa là giải pháp này phụ thuộc vào mã bảo mật mùa xuân có thể thay đổi trong tương lai).

Sau đây là các bước sau:

(1) Xác định một bean DaoAuthenticationProvider (nếu bạn đã có một tài sản sau đó thiết lập hideUserNotFoundExceptions của nó là false). Dưới đây là Java cấu hình phong cách:

@Bean 
public AuthenticationProvider daoAuthenticationProvider() { 
    DaoAuthenticationProvider impl = new DaoAuthenticationProvider(); 
    impl.setUserDetailsService(yourUserDetailsService()); 
    impl.setHideUserNotFoundExceptions(false) ; 
    return impl ; 
} 

(2) Cấu hình quản lý xác thực với nhà cung cấp trên:

<authentication-manager alias="authenticationManager"> 
    <authentication-provider ref="daoAuthenticationProvider"/> 
<!-- other providers if any --> 
</authentication-manager> 

(3) Tạo một ngoại lệ mở rộng UsernameNotFoundException:

public class DisabledException extends UsernameNotFoundException { 

    public DisabledException(String msg) { 
    super(msg); 
    } 

    /* other constructors */  
} 

(4) Trong UserDetailsService của bạn, hãy ném ngoại lệ trên bằng bất kỳ phím thông báo nào bạn muốn:

throw new DisabledException(messages.getMessage(
         "AbstractUserDetailsAuthenticationProvider.disabled", "User is disabled")); 

đây thông điệp là SpringSecurityMessageSource.getAccessor()

+0

Ritesh, cảm ơn câu trả lời của bạn. Phần làm việc đang ẩn UserNotFoundException. Tuy nhiên, bây giờ tôi nhận được thông báo "người dùng có tên xyz không tìm thấy" ngay cả khi tôi ném ngoại lệ tùy chỉnh của mình bằng một thông báo khác. – Jayz

+0

Rất tiếc, đã đăng quá sớm. Điều này hoạt động hoàn hảo – Jayz

+0

Jayz, thực hành thông thường là để ném ngoại lệ từ UserDetailsService chỉ khi bạn không thể tìm thấy người dùng (theo mặc định BadCredentialsException sẽ được ném với thông điệp quan trọng AbstractUserDetailsAuthenticationProvider.badCredentials). Nếu bạn muốn chỉ ra người dùng bị vô hiệu hóa thì bạn không nên ném ngoại lệ và trả về người dùng với cờ được kích hoạt là false (theo mặc định là DisabledException sẽ được ném với khóa thông báo AbstractUserDetailsAuthenticationProvider.disabled). (Có lẽ đây là câu trả lời của tôi ngay từ đầu) – Ritesh

0

Tạo một tập tin bất động sản trên đường đi lớp như loginMessage.properties

Trong đó tập tin bất động sản, định

AbstractUserDetailsAuthenticationProvider.badCredentials = Tên đăng nhập/mật khẩu nhập không đúng.

Thêm đậu sau trong applicationContext.xml của bạn,

<bean id="messageSource" 
    class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>loginMessage</value> 
     </list> 
    </property> 
</bean> 

Trong userDao, nếu kết quả rỗng

throw new UsernameNotFoundException(""); 

Sau đó, u'll nhận được tin nhắn như Username/Password nhập không đúng. thay vì thông tin đăng nhập không hợp lệ