Я использую аутентификацию ldap для защиты весеннего загрузочного приложения. Я хочу авторизовать конечные точки для определенных групп сервера ldap. Какие-либо предложения?
Вот мой файл SecurityConfig.java.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/403","/login","/footer").permitAll()
.antMatchers("/","/LifeForm**","/home").fullyAuthenticated()
//.anyRequest().authenticated()
.and()
//.httpBasic()
//.and()
.formLogin()
.loginPage("/login").failureUrl("/403").permitAll()
.and()
.logout().logoutUrl("/403").invalidateHttpSession(true).deleteCookies("JSESSIONID").logoutSuccessUrl("/login");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
if (Boolean.parseBoolean(ldapEnabled)) {
auth
.ldapAuthentication()
.userSearchFilter("(&(objectClass=user)(sAMAccountName = {0}))")
.groupRoleAttribute("cn")
.groupSearchFilter("(&(objectClass=groupOfNames)(member = {0}))")
.groupSearchBase("ou=groups")
.contextSource()
.url(ldapUrls + ldapBaseDn)
.managerDn(ldapSecurityPrincipal)
.managerPassword(ldapPrincipalPassword);
} else {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER")
.and()
.withUser("admin").password("admin").roles("ADMIN");
}
}




Попробуйте добавить «antMatcher», который проверяет один авторитет в Ldap.
Например:
.antMatchers("/admins").hasAuthority("GROUP-SPAIN")
У меня есть эта конфигурация в моем приложении
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
//.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
// allow anonymous resource requests
.antMatchers(
HttpMethod.GET,
"/",
"/v2/api-docs", // swagger
"/webjars/**", // swagger-ui webjars
"/swagger-resources/**", // swagger-ui resources
"/configuration/**", // swagger configuration
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.css",
"/**/*.js"
).permitAll()
.antMatchers("/auth/**").permitAll()
.antMatchers("/management/**/*", "/management/*.json").hasAuthority("ADMIN")
.antMatchers("/admins").hasAuthority("GROUP-SPAIN"")
.anyRequest().authenticated();
}
Вам нужно создать класс UserDetailsService для добавления необходимых вам полномочий вместо группы пользователей. В примере я использую базу данных в качестве примера, вам нужно изменить мой userDao для вашего подключения ldap.
@Component
public class TodoListUserDetailsService implements UserDetailsService {
@Autowired
private UserDao userDao; //Change for ldap conection
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//Get the user from ldap.
AppUser user = userDao.findByUsername(username);
if (null == user) {
throw new UsernameNotFoundException(String.format("Username {0} doesn't exist", username));
}
List<GrantedAuthority> authorities = new ArrayList<>();
//this part is pseudocode
user.getGroups().forEach(ldapGroup -> {
authorities.add(new SimpleGrantedAuthority(ldapGroup.toString()));
});
UserDetails userDetails = new User(user.getUsername(), user.getPassword(), authorities);
return userDetails;
}
}
Spring будет использовать ваш UserDetailsService, когда пользователь попытается получить доступ к приложению.
Да, но речь идет о ролях, а не о группах. Верно? Я не знаю имен ролей на своем сервере Ldap. Я хочу авторизовать свое приложение по имени группы
У вас это сработало? Я сейчас борюсь с той же проблемой, и моя конфигурация LDAP похожа на вашу, но мои группы не сопоставляются с органами власти? Приветствуется любая помощь!