Cố gắng hiểu cách xác thực OpenID xác thực với Spring Security là cách chính xác.OpenID bảo mật mùa xuân - UserDetailsService, AuthenticationUserDetailsService
public class OpenIDUserDetailsService implements
UserDetailsService,
AuthenticationUserDetailsService {
@Override
public UserDetails loadUserByUsername(String openId) throws
UsernameNotFoundException, DataAccessException {
// I either want user email here
// or immediately delegate the request to loadUserDetails
}
@Override
public UserDetails loadUserDetails(Authentication token) throws
UsernameNotFoundException {
// This never gets called if I throw from loadUserByUsername()
}
private MyCustomUserDetails registerUser(String openId, String email) {
...
}
}
Tôi đang xem xét kịch bản khi người dùng chưa đăng ký trong đơn đăng ký của mình. Để đăng ký người dùng, tôi cần biết OpenID và email của nó.
Khi nhà cung cấp OpenID chuyển hướng người dùng trở lại ứng dụng của tôi, loadUserByUsername()
được gọi, nhưng trong trường hợp này tôi chỉ biết về OpenID của người dùng. Vì vậy, tôi đang ném UsernameNotFoundException
và sau đó loadUserDetails()
không bao giờ được gọi, vì vậy tôi không thể đăng ký người dùng.
Giải pháp phổ biến ở đây là gì? Nếu tôi trả lại một cái gì đó như FakePartialUserDetails
từ loadUserByUsername()
và sau đó, khi loadUserDetails()
được gọi, tôi đăng ký người dùng và sau đó trả lại MyCustomUserDetails
thực?
Tôi đang sử dụng Xuân An 3.0.7.RELEASE
Điều này không đúng. Trong 3.1, OpenIDAuthenticationProvider có các bộ định cư cho cả UserDetailsService và AuthenticationUserDetailsService và các lệnh gọi là loadUserByUsername hoặc loadUserDetails tùy thuộc vào setter nào được sử dụng. Trong 3.0.7, không có setter cho AuthenticationUserDetailsService và vì vậy nó luôn được sử dụng loadUserByUsername. – Ritesh