Рабочий пример клиента JAVA REST для доступа к API CAS REST
я следовал этой учебник для включения службы REST на моем локальном сервере CAS.
однако нет примера Java
"на Java пример REST-клиента
нам нужен реальный, рабочий, пример, предыдущий бесполезен. Многие люди писали мне, что это не работает, и я подтверждаю, что это не работает."
Я смог найти этой но это, к сожалению, не сработало для меня.
любой указатели/ссылки? Ценится.
4 ответов
понял!
вот полное решение о том, как включить CAS REST API и иметь возможность подключиться к нему через Java rest client, чтобы принести пользу другим
- получить исходный код CAS.
- комментарий этой статьи
- добавить следующее в pom.xml, как предложено в статье в #2
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-integration-restlet</artifactId>
<version>${cas.version}</version>
<type>jar</type>
</dependency>
- обязательно добавьте в pom следующее.xml, чтобы избежать столкновений Spring jar. В моем случае, cas-server-integration-restlet зависел от spring-web, который по умолчанию использовал более старую версию Spring. Итак, я явно определил
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
- скомпилируйте код cas. Надо позвать Каса.война в вашей целевой папке.
- загрузите его на свой сервер, измените разрешения на tomcat и дождитесь его развертывания
- в CATALINA / conf найти сервер.конфигурация порта xml и uncomment 8443, чтобы наш сервер разрешил SSL подключение. Кроме того, укажите свои сертификаты здесь.
- Теперь перейдите к взорванному cas.файл war и перейдите в папку WEB-INF, чтобы найти deployerConfigContext.XML-файл. Укажите, что CAS будет использовать для аутентификации. В моем случае я использовал LDAP.
- добавить следующее В web.xml на статью выше
<servlet>
<servlet-name>restlet</servlet-name>
<servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restlet</servlet-name>
<url-pattern>/v1/*</url-pattern>
</servlet-mapping>
- перезапустите tomcat, чтобы изменения вступили в силу.
- проверьте, что вы можете войти в систему через стандарт CAS UI:
https://server:8443/cas/login
- проверьте, что REST API был открыт через:
https://server:8443/cas/v1/tickets
- теперь давайте подключимся к нему. Я использовал этой пример кода. Не забудьте указать правильные ссылки и имя пользователя/пароль
- когда я попытался запустить код как есть, он пожаловался на " вызвано: javax.сеть.ssl.SSLHandshakeException: солнце.безопасность.валидатор.ValidatorException: ошибка построения пути PKIX: sun.безопасность.поставщик.certpath.SunCertPathBuilderException: не удается найти допустимый путь сертификации в требуемое целевое". В основном просят вас установить сертификаты. Если у вас есть доступ к серверу, просто скопируйте его. Если нет, я нашел этой код, который позаботится об установке для вас, если у вас нет доступа или просто слишком ленивый:)
- теперь, если вы запустите клиент JAVA CAS с действительными учетными данными, вы должны увидеть что-то вроде
201 https://server_name:8443/cas/v1/tickets/TGT-4-rhVWLapYuOYi4InSEcmfNcABzaLMCPJgGIzlKqU1vb50zxb6pp-server_name Tgt is : TGT-4-rhVWLapYuOYi4InSEcmfNcABzaLMCPJgGIzlKqU1vb50zxb6pp-server_name.ndev.coic.mil Service url is : service=https%3A%2F%2Fmyserver.com%2FtestApplication https://server_name:8443/cas/v1/tickets/TGT-4-rhVWLapYuOYi4InSEcmfNcABzaLMCPJgGIzlKqU1vb50zxb6pp-server_name Response code is: 200 200 ST-4-BZNVm9h6k3DAvSQe5I3C-server_name
- вы можете увидеть 200 код и билет. Если вы были чтобы просмотреть журналы вашего cas на сервере, вы должны увидеть сообщения об успешной athentication и генерации билетов.
- измените имя пользователя / пароль на некоторые фиктивные данные и попробуйте запустить код. Вы получите сообщение об ошибке 400, что означает, что разрешение на доступ было отказано.
успехов!
для CAS 4.0 это немного проще (протестировано на apache-tomcat-7.0.55)
В пом.xml добавить следующую зависимость
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-integration-restlet</artifactId>
<version>4.0.0</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
прямая зависимость от springframework не обязательно, потому что исключения предотвращают дублирование пакетов
в интернете.xml вам нужно добавить сопоставление сервлетов для restlet (пакет mind изменился с com.ноэлиос.restlet... к org.restlet...
<servlet>
<servlet-name>restlet</servlet-name>
<servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restlet</servlet-name>
<url-pattern>/v1/*</url-pattern>
</servlet-mapping>
в результате вышеуказанных шагов в YUOR WEB-INF / lib каталог после новых файлов должны быть добавлены
ls target/cas/WEB-INF/lib/ | grep restlet
cas-server-integration-restlet-4.0.0.jar
org.restlet-2.1.0.jar
org.restlet.ext.servlet-2.1.0.jar
org.restlet.ext.slf4j-2.1.0.jar
org.restlet.ext.spring-2.1.0.jar
Если вы хотите пропустить проверку сертификата, добавьте это в свой клиент Java
//////////////////////////////////////////////////////////////////////////////////////
// this block of code turns off the certificate validation so the client can talk to an SSL
// server that uses a self-signed certificate
//
// !!!! WARNING make sure NOT to do this against a production site
//
// this block of code owes thanks to http://www.exampledepot.com/egs/javax.net.ssl/trustall.html
//
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType){}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType){}
}
};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
//
//
// end of block of code that turns off certificate validation
// ////////////////////////////////////////////////////////////////////////////////////
обычно разработчики путаются в том, как заставить клиента rest работать при доступе к защищенной веб-службе CAS. Большинство вопросов там спрашивали, Как получить restlet CAS обеспечивает веб-сервис и как вызвать этот веб-сервис, потому что никакой реальный пример не работал.
ну на самом деле есть. Groovy пример находится на примере restlet JASIG Cashttps://wiki.jasig.org/display/casum/restful + api ясно показывает, как пройти аутентификацию для вызова службы (ее использование Groovy, но преобразование в Java должно быть прямым). Но, на мой взгляд, это не ясно объясняет, что клиент должен аутентифицироваться в назначенной веб-службе сначала перед доступом к защищенной веб-службе CAS.
например, предположим, что существует служба JSON, которая защищена с помощью CAS и сборки с Java и Spring. И вы используете код, который описывает в разделе groovy на https://wiki.jasig.org/display/casum/restful + api
String casUrl="https://yourcas.com/v1/tickets"
String springTicketValidation="http://yourservice.com/j_spring_cas_security_check"
String serviceToCall="http://yourservice.com/serviceToCall"
чтобы получить клиент сервиса сможет позвонить в сервис, нужно следовать этим простым правилам:
- получите билет на предоставление билета от CAS
- получите свой сервисный билет от cas для назначенного сервисного вызова (service to call)
- аутентификация в вашем сервисном валидаторе билетов (на данный момент url указан в springTicketValidation)
- наконец-вызова
или в перспективе кода
String ticketGrantingTicket = getTicketGrantingTicket(casUrl, username, password)
String serviceTicket = client.getServiceTicket(casUrl, ticketGrantingTicket, serviceToCall)
// validate your ticket first to your application
getServiceCall(springTicketValidation, serviceTicket)
getServiceCall(serviceToCall, serviceTicket)
и для вашего Примечания все эти операции должны выполняться в следующем состоянии:
- ваш вызов (как вызов restlet, так и вызов службы) должен быть выполнен в том же