मैं वसंत बूट के साथ एक ऐप बना रहा हूं जिसमें एलडीएपी के साथ एकीकरण है। मैं सफलतापूर्वक एलडीएपी सर्वर से कनेक्ट करने और उपयोगकर्ता को प्रमाणीकृत करने में सक्षम था। अब मुझे याद रखने की कार्यक्षमता जोड़ने की आवश्यकता है। मैंने विभिन्न पदों (this) को देखने की कोशिश की लेकिन मेरी समस्या का उत्तर नहीं मिला। आधिकारिक स्प्रिंग सुरक्षा document कहा गया है किवसंत सुरक्षा एलडीएपी और मुझे याद रखें
आप एक प्रमाणीकरण प्रदाता जो एक UserDetailsService का उपयोग नहीं करता उपयोग कर रहे हैं (उदाहरण के लिए, LDAP प्रदाता) तो यह काम नहीं करेगा जब तक कि आप भी इसमें UserDetailsService सेम है आपके आवेदन संदर्भ
यहाँ कुछ प्रारंभिक विचारों के साथ मेरे कार्य कोड जोड़ने के लिए याद-मुझे कार्यक्षमता:
WebSecurityConfig
import com.ui.security.CustomUserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.event.LoggerListener;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider;
import org.springframework.security.ldap.userdetails.UserDetailsContextMapper;
import org.springframework.security.web.authentication.RememberMeServices;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
String DOMAIN = "ldap-server.com";
String URL = "ldap://ds.ldap-server.com:389";
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/ui/**").authenticated()
.antMatchers("/", "/home", "/UIDL/**", "/ui/**").permitAll()
.anyRequest().authenticated()
;
http
.formLogin()
.loginPage("/login").failureUrl("/login?error=true").permitAll()
.and().logout().permitAll()
;
// Not sure how to implement this
http.rememberMe().rememberMeServices(rememberMeServices()).key("password");
}
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
authManagerBuilder
.authenticationProvider(activeDirectoryLdapAuthenticationProvider())
.userDetailsService(userDetailsService())
;
}
@Bean
public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(DOMAIN, URL);
provider.setConvertSubErrorCodesToExceptions(true);
provider.setUseAuthenticationRequestCredentials(true);
provider.setUserDetailsContextMapper(userDetailsContextMapper());
return provider;
}
@Bean
public UserDetailsContextMapper userDetailsContextMapper() {
UserDetailsContextMapper contextMapper = new CustomUserDetailsServiceImpl();
return contextMapper;
}
/**
* Impl of remember me service
* @return
*/
@Bean
public RememberMeServices rememberMeServices() {
// TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices("password", userService);
// rememberMeServices.setCookieName("cookieName");
// rememberMeServices.setParameter("rememberMe");
return rememberMeServices;
}
@Bean
public LoggerListener loggerListener() {
return new LoggerListener();
}
}
CustomUserDetailsServiceImpl
public class CustomUserDetailsServiceImpl implements UserDetailsContextMapper {
@Autowired
SecurityHelper securityHelper;
Log ___log = LogFactory.getLog(this.getClass());
@Override
public LoggedInUserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> grantedAuthorities) {
LoggedInUserDetails userDetails = null;
try {
userDetails = securityHelper.authenticateUser(ctx, username, grantedAuthorities);
} catch (NamingException e) {
e.printStackTrace();
}
return userDetails;
}
@Override
public void mapUserToContext(UserDetails user, DirContextAdapter ctx) {
}
}
मुझे पता है कि मैं किसी भी तरह UserService लागू करने की आवश्यकता है, लेकिन यकीन नहीं है कि कैसे प्राप्त किया जा सकता।
अच्छा जवाब Vladimír! त्वरित प्रश्न। कोड की इस पंक्ति में: PersistentTokenBasedRememberMeServices सेवाएं = नया PersistentTokenBasedRememberMeServices (staticKey, RememberMeUserDetailsService, RememberMeTokenRepository); मुझे लगता है कि "staticKey" "internalSecretKey" जैसा ही है। क्या वो सही है? – Maksim
हां, यह वही कुंजी है - इसका उपयोग यह सत्यापित करने के लिए किया जाता है कि RememberMe प्रमाणीकरण टोकन को इस रहस्य के ज्ञान के साथ बनाया गया था और RememberMe प्रमाणीकरण प्रदाता में सत्यापित किया गया था। सुनिश्चित करें कि आप मेरे उत्तर के नवीनतम संस्करण का उपयोग कर रहे हैं, क्योंकि उपर्युक्त वर्तमान पाठ में इसे सभी जगहों पर "आंतरिक सुरक्षा" के रूप में जाना जाता है। –
बढ़िया, बहुत बहुत धन्यवाद! सब कुछ काम करता है! – Maksim