Как правильно настроить аутентификацию ldap при весенней загрузке?Каждый раз, когда я вхожу в систему, он перенаправляет на / login после вызова / auth - PullRequest
0 голосов
/ 01 марта 2019

ПРИМЕЧАНИЕ Предложенный ответ не сработал.

У меня есть следующая конфигурация в WebSecurityConfigurerAdapter:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
            .userSearchBase("somevalue")
            .userSearchFilter("somevalue")
            .contextSource().url("somevalue").port("somevalue")
            .managerDn("somevalue").managerPassword("somevalue");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/*.css", "/*.html", "/*.js", "/*.jpg").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().loginPage("/login")
            .loginProcessingUrl("/auth")
            .permitAll();
}

И это моя конфигурация в WebMvcConfigurer:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/*.css", "/*.html", "/*.js", "/*.jpg")
            .addResourceLocations("classpath:/static/");

    registry.addResourceHandler("/", "/login", "/myapp")
            .addResourceLocations("classpath:/static/index.html")
            .resourceChain(true)
            .addResolver(new PathResourceResolver() {
                @Override
                protected Resource getResource(String resourcePath, Resource location) {
                    if (resourcePath.startsWith("/api") || resourcePath.startsWith("/api".substring(1))) {
                        return null;
                    }
                    return location.exists() && location.isReadable() ? location : null;
                }
            });
}

Когда я нажимаю кнопку входа, я отправляю следующий запрос в угловом виде:

this.http.post(`localhost:8080/auth`, {username: 'user', password: 'password'})...

Но я только перенаправлен на / login.Вот сетевая консоль:

auth                        302
login                       200

Вот заголовки и тело запроса (/ auth):

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 47
Content-Type: application/json
Cookie: JSESSIONID=*****somecookie*****
Host: localhost:8080
Origin: http://localhost:8080
Referer: http://localhost:8080/login

Полезная нагрузка:

{username: "user", password: "password"}

Общие сведения:

Request URL: http://localhost:8080/auth
Request Method: POST
Status Code: 302 
Remote Address: [::1]:8080
Referrer Policy: no-referrer-when-downgrade

Заголовки ответа:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Fri, 01 Mar 2019 10:49:09 GMT
Expires: 0
Location: http://localhost:8080/login
Pragma: no-cache
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

А вот когда он перенаправляет на / login:

General:

Request URL: http://localhost:8080/login
Request Method: GET
Status Code: 200 
Remote Address: [::1]:8080
Referrer Policy: no-referrer-when-downgrade

Запрос:

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Cookie: JSESSIONID=*****somecookie*****
Host: localhost:8080
Referer: http://localhost:8080/login

По сути, тело ответа - это содержимое моего index.html.

И в консоли написано:

error: {error: SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse...
headers: e {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure during parsing for http://localhost:8080/login"
name: "HttpErrorResponse"
ok: false
status: 200
statusText: "OK"
url: "http://localhost:8080/login"

Кроме того, правильна ли моя конфигурация ldap?Как правильно настроить аутентификацию ldap?

ОБНОВЛЕНИЕ В соответствии с рекомендацией я изменил свой код для отправки тела в виде http-параметров.Запрос теперь такой:

Заголовки запроса: Content-Type: application/x-www.form-urlencoded;charset=UTF-8

Данные формы username=user&password=password

Это все та же проблема

1 Ответ

0 голосов
/ 05 марта 2019

Ответ на мой вопрос - недостающий csrf.Если я не отключаю csrf, Spring Security, кажется, ищет это, в противном случае мой запрос перенаправляется обратно на страницу входа.Я исправил, добавив следующее:

http.csrf().disable()

Для Request method 'POST' not supported во время /login, в моем AuthenticationSuccessHandler.onAuthenticationSuccess() я положил

request.getRequestDispatcher(targetURI).forward(request, response);

Вместо этого я просто установил ответсо строковым значением:

response.getOutputStream().println(mapper.writeValueAsString(data));
...