как залогиниться в Geoserver из JavaScript

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 24 дек 2014, 14:44

Есть 2 ресурса:
mydomain:8080/appp - сайт
mydomain:8181/geoserver - понятно что такое :)

в коде, который на сайте, нужно авторизироваться на геосервере.
пробую пока так

Код: Выделить всё

function init(){
    
    $.ajax({
            url: "http://localhost:8080/geoserver/j_spring_security_check",
            type: "POST",
            //async: false,
            crossDomain: true,
            data: {username: 'admin', password: 'secret'},
            //username: "admin",
            //password: "secret"
        }).done(function(data) {
                console.log(data );
                $('#data').html(
                        data
                        );
                }   
            
        );
}
у меня отсутствие опыта работы с веб-приложениями :oops: нуб

geka83
Участник
Сообщения: 78
Зарегистрирован: 03 май 2014, 21:02
Репутация: 5

Re: как залогиниться в Geoserver из JavaScript

Сообщение geka83 » 30 дек 2014, 23:17

а зачем вам там логинится? что вы хотите сделать?

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 12 янв 2015, 05:46

для того чтобы иметь доступ к данным. анонимный доступ отключён.

вот что нашёл, но не работает:
http://stackoverflow.com/questions/1095 ... 0#13123640

браузер ругается

Код: Выделить всё

Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на http://localhost:8080/geoserver/j_spring_security_check. Это может быть исправлено путем перемещения ресурса в тот же домен или включением CORS.
Снимок1.png
Снимок1.png (55.03 КБ) 12066 просмотров
у Geoserver (работает в Tomcat 8) файл web.xml содержит следующие строки (включение CORS):

Код: Выделить всё

<filter>
	  <filter-name>CorsFilter</filter-name>
	  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
	  <init-param>
		<param-name>cors.allowed.origins</param-name>
		<param-value>*</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.allowed.methods</param-name>
		<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.allowed.headers</param-name>
		<param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Access-Control-Allow-Headers,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method</param-value>
	  </init-param>
	  
	<!--   <init-param>
		<param-name>cors.exposed.headers</param-name>
		<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
	  </init-param> -->
	  <init-param>
		<param-name>cors.support.credentials</param-name>
		<param-value>true</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.preflight.maxage</param-name>
		<param-value>10</param-value>
	  </init-param>
	</filter>

=========================

<filter-mapping>
	  <filter-name>CorsFilter</filter-name>
	  <url-pattern>/*</url-pattern>
	</filter-mapping>

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 13 янв 2015, 07:19

Добился результата. Помог Google и MDN

web.xml Geoserver'а:

Код: Выделить всё

<filter>
	  <filter-name>CorsFilter</filter-name>
	  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
	  <init-param>
		<param-name>cors.allowed.origins</param-name>
		<param-value>*</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.allowed.methods</param-name>
		<param-value>GET,POST,OPTIONS</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.allowed.headers</param-name>
		<param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Access-Control-Allow-Headers,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method</param-value>
	  </init-param>
	  
	  <init-param>
		<param-name>cors.exposed.headers</param-name>
		<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Access-Control-Allow-Headers</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.support.credentials</param-name>
		<param-value>true</param-value>
	  </init-param>
	  <init-param>
		<param-name>cors.preflight.maxage</param-name>
		<param-value>1000000</param-value>
	  </init-param>
	</filter>



       <filter-mapping>
	  <filter-name>CorsFilter</filter-name>
	  <url-pattern>/*</url-pattern>
	</filter-mapping>
JavaScript:

Код: Выделить всё

var req = new XMLHttpRequest();
    req.open('POST', 'http://localhost:8080/geoserver/j_spring_security_check', true);
    req.setRequestHeader('Access-Control-Allow-Origin', '*');
    req.setRequestHeader('Access-Control-Allow-Credentials', 'true');
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    req.followsRedirect=false; 
    req.withCredentials=true;

    req.send('username=admin&password=paSS');
Написал ещё в бложике

Voin
Интересующийся
Сообщения: 42
Зарегистрирован: 13 сен 2013, 12:05
Репутация: 3
Откуда: Berlin

Re: как залогиниться в Geoserver из JavaScript

Сообщение Voin » 31 янв 2015, 21:04

а Вам не кажется что это небезопасно?

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 01 фев 2015, 19:00

нормально, для простого "посмотреть" самое то.
а вообще есть отдельная аутентификация по ключу, boundless замутили нужный аддон к геосерверу

Voin
Интересующийся
Сообщения: 42
Зарегистрирован: 13 сен 2013, 12:05
Репутация: 3
Откуда: Berlin

Re: как залогиниться в Geoserver из JavaScript

Сообщение Voin » 01 фев 2015, 20:15

Филиппов Владислав писал(а):а вообще есть отдельная аутентификация по ключу, boundless замутили нужный аддон к геосерверу
а вот это интересно, название аддона не поскажите? он бесплатный или по коммерческой лицензии?

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 02 фев 2015, 05:14


Voin
Интересующийся
Сообщения: 42
Зарегистрирован: 13 сен 2013, 12:05
Репутация: 3
Откуда: Berlin

Re: как залогиниться в Geoserver из JavaScript

Сообщение Voin » 02 фев 2015, 10:25

спасибо огромное! раньше я этого не видел. Знали бы Вы сколько проблем это мне поможет решить. В частности я пишу программу с World Wind Java SDK, где мне нужно организовать доступ к некоторым слоям из геосервера нашей организации. WMS интерфейс реализованный в World Wind не поддерживает HTTP аутентификацию, думал придется модуль переписывать, а теперь проблема решена :)

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 25 янв 2017, 07:19

подниму тему, ибо опять проблемы с Basic Auth. Правда GeoServer новее. версии 2.10. CORS разрешёны.

Код: Выделить всё

            var req = new XMLHttpRequest();
            req.open('POST', 'http://dp-geos02:8080/geoserver/j_spring_security_check', true);

            req.followsRedirect = false;
            req.withCredentials = true;
            req.onreadystatechange = loadMap;
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            req.setRequestHeader('Access-Control-Allow-Origin', '*');
            req.setRequestHeader('Access-Control-Allow-Credentials', 'true');
            req.setRequestHeader('Authorization', 'Basic ' + btoa(username + ':' + password));
так как это не простой запрос, то браузер сначала отправляет предзапрос (preflight) методом OPTIONS, его задача – спросить сервер, разрешает ли он использовать выбранный метод и заголовки. Он должен завершиться со статусом 200 ОК, но он теперь завершается со статусом 302 и сообщением Response for preflight is invalid (redirect). Из-за этого метод POST не работает.

Как всё-таки правильно работать с системой безопасности GeoServer с веб-страницы расположенной на другом домене?

UPD
изменил метод запроса на OPTIONS
сработало.
в ответе есть JSESSIONID
слой грузится с сервера, причём, на другой закладке браузера на страничке просмотра слоёв Geoserver'а, разрешён просмотр этого слоя.
Насколько всё это правильно?
Последний раз редактировалось Филиппов Владислав 25 янв 2017, 08:48, всего редактировалось 1 раз.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Denis Rykov » 25 янв 2017, 08:43

Я думаю, что неправильно настроен сервер, так как в ответ на OPTIONS должен приходить 200, а не 302.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 25 янв 2017, 08:51

и в какой части сервера копать?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Denis Rykov » 25 янв 2017, 09:11

Я не знаю какой сервер у вас используется. Что касается того, что если открыть новую вкладку с геосервером и пользователь там уже залогинен - это нормально, он же прошёл базовую аутентификацию. Теперь что касается клиента, может я что-то не понял, но к чему вы добавляете эти заголовки, часть из них вообще не должны фигурировать в заголовках запросов, а только в ответах, заголовок с авторизацией тоже не нужно передавать, вы же выше указываете, что запрос идёт с withCredentials:

Код: Выделить всё

req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.setRequestHeader('Access-Control-Allow-Origin', '*');
req.setRequestHeader('Access-Control-Allow-Credentials', 'true');
req.setRequestHeader('Authorization', 'Basic ' + btoa(username + ':' + password));
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Филиппов Владислав » 25 янв 2017, 09:28

GeoServer работает в Tomcat 8, Debain 9
я указывал различные параметры запроса из-за недостаточного опыта, "методом тыка", источник - stackoverflow
ещё смотрел - https://learn.javascript.ru/xhr-crossdomain

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как залогиниться в Geoserver из JavaScript

Сообщение Denis Rykov » 25 янв 2017, 09:33

А что вообще нужно сделать и для чего потребовался AJAX?
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей