Для вашего удобства этот ответ поставляется с полным и рабочим образцом , включая сервер LDAP, заполненный пользователями и группами, и интеграционным тестом, так что вы можете запустить эти тесты самостоятельно.
Предположим, у вас есть следующий пользователь в LDAP
dn: cn=marissa,ou=Users,dc=test,dc=com
changetype: add
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: marissa
userPassword: koala
uid: 20f459e0-e30b-4d1f-998c-3ded7f769db1
mail: marissa@test.com
sn: Marissa
Имя пользователя Марисса и пароль Коала .
Давайте начнемс тестовым примером:
@Test
@DisplayName("ldap login works")
void doLogin() throws Exception {
mvc.perform(
MockMvcRequestBuilders.post("/login")
.param("username", "marissa")
.param("password", "koala")
.with(csrf())
)
.andExpect(status().is3xxRedirection())
.andExpect(authenticated())
;
}
Из этого теста мы можем сделать вывод, что
- LDAP использует форму входа в систему, имя пользователя / пароль
- Форма имеет защиту CSRF
Итак, давайте настроим ваше приложение Spring Boot, используя конфигурацию Java
Классический пример файла, SecurityConfig.java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
Конфигурация безопасности не изменяется.
- Мы хотим, чтобы пользователи были полностью аутентифицированы
- Мы хотим использовать форму входа в систему
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.fullyAuthenticated()
.and()
.formLogin()
;
}
Вот и все, затем мы настраиваем LDAP, снова вВаш SecurityConfig.java
мы делаем это, вызывая AuthenticationManagerBuilder
.Это bean-компонент, который настраивает Spring Security.Таким образом, мы можем получить к нему доступ, используя @Autowired
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.contextSource()
.url("ldap://localhost:389")
.managerDn("cn=admin,dc=test,dc=com")
.managerPassword("password")
.and()
.userSearchBase("ou=Users,dc=test,dc=com")
.userSearchFilter("cn={0}")
.groupSearchBase("dc=test,dc=com")
.groupSearchFilter("member={0}")
;
}
и все.Теперь я использовал некоторый код, который я написал из проекта Cloud Foundry UAA, для создания LDAP-сервера в памяти для моих интеграционных тестов.
Поэтому, когда запускается фиктивный интеграционный тест MVC, он запускаетсясервер LDAP для запуска.
Это действительно так просто.Теперь вы можете расширить этот образец, чтобы сопоставить группы LDAP с полномочиями Spring Security.
Образец LDAP доступен в моем репозитории сообщества: https://github.com/fhanik/spring-security-community.git