LINUX.ORG.RU

Деплоинг на tomcat ломает авторизацию SpringSecurity

 , ,


0

2

Тестовый проект SpringBoot.

protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").authenticated()
                .anyRequest().permitAll()
                .and()
            .formLogin()
                .loginPage("/signin")
                .permitAll()
                .failureUrl("/signin?error=1")
                .loginProcessingUrl("/authenticate")
                .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessUrl("/signin?logout")
                .and()
            .rememberMe()
                .rememberMeServices(rememberMeServices())
                .key("remember-me-key");
    }

Т.е. при обращении к /admin должно перекинуть на /signin, где пользователь заполняет форму, а при проверка авторизации осуществляется спрингом по урл /authenticate.

Вот ровно так работает до деплоя на томкат. После деплоя - адрес проекта получается вида http://localhost:9080/project/, и теперь все эти урлы, участвующие в авторизации, должны работать относительно адреса проекта.

Но как бы не так. Форма авторизации отправляется на http://localhost:9080/authenticate, а не на http://localhost:9080/project/authenticate. Как это пофиксить? не прописывать же имя проекта в шаблоне формы?

★★★★★

Томкат же не торчит напрямую во внешний мир? Есть же некий реверс прокси? Вот на нём рерайти урлы.

Hater ★★
()
Ответ на: комментарий от Hater

пробую локально - работает, как описал.

настроил прокси в nginx:


location / {
          proxy_pass http://localhost:9080/Spring-1.0/;
          proxy_set_header Host            $host;
          proxy_set_header X-Forwarded-Server $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_redirect http://domain.com/Spring-1.0 http://domain.com;
          proxy_redirect http://domain.com/authenticate http://domain.com/Spring-1.0/authenticate;
       }

Оно мне пишет, что

403 Forbidden

Request page: /Spring-1.0/authenticate
bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Hater

Ну для потренироваться, как первое.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Hater

я так понимаю, что спрингбут маппит не тот урл. он маппит абсолютный /authenticate, а надо - относительно проекта - /Spring-1.0/authenticate.

Как это исправить?

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от bvn13

Я так понимаю что URI проекта /Spring-1.0. Тогда надо удалить из правила nginx proxy_redirect и оставить что-то вроде

location / {
          proxy_pass http://localhost:9080/Spring-1.0/;
       }
Hater ★★
()
Ответ на: комментарий от Hater

я сделал теперь так:

 location /authenticate {
          proxy_pass http://localhost:9080/Spring-1.0/authenticate;
          proxy_set_header Host            $host;
          proxy_set_header X-Forwarded-Server $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_redirect http://domain.com/Spring-1.0 http://domain.com;
       }

При этом получаю

403 Forbidden

Request page: /Spring-1.0/authenticate

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

А разьве, любая машинка воспримет 2 РАЗА auten/*(!??)(!) Каким ли: это SEPARATOR = + выправить, либо в лок добавить что должно читаться , (типа етцODF, ну иль /**/).

anonymous
()
Ответ на: комментарий от bvn13

Проверь, в джарнике в корне должен быть каталог META-INF в нем лежать context.xml. И проверь что Context у тебя прописан только в context.xml и в server.xml его нет. Если и там и там то работать не будет.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

не, эта шляпа не работает. я даже задеплоил из веб-интерфейса не файл-war, а каталог, указав конкретный ContextPath. Все равно не работает. При авторизации перекидывает на domain.com/authenticate (post-запрос делается), ошибка 404. Если же я в браузере отладчиком изменяю урл на domain.com/Spring-1.0/authenticate и делаю POST запрос, то ловлю ошибку 403 Forbidden. Складывается ощущение, что SpringBoot чего-то не понимает.

bvn13 ★★★★★
() автор топика

некий scav из irc-канала #java-talks сказал, что деплоить SpringBoot на томкат (и вообще куда-либо) - не комильфо. Нужно делать StandAlone.

шаблон для systemd service описан тут

но у меня получилось запустить только как java -jar file.jar с полными путями

[Unit]
Description=myapp
After=syslog.target

[Service]
User=myapp
ExecStart=/usr/bin/java -jar /var/myapp/myapp.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от drsm

да причем тут context path? меня дефолтный устраивает. проблема не в этом. а в том, что 403 Ошибка на пост запрос. хотя все .permitAll()

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Говно, потому что делает простые вещи (аутентификацию, например) ненормально сложными, с побочными эффектами и потому, что дебажить эту хрень невозможно.

Неговно - написать аутентификацию самостоятельно.

dzidzitop ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.