我按照本教程在本地 CAS 服务器上启用 REST 服务。
但是没有Java示例
“Java REST 客户端示例
我们需要一个真实的、有效的例子,前一个是没用的。许多人给我发电子邮件说它不起作用,我确认它不起作用。”
我能够找到这个,但不幸的是这对我不起作用。
任何指针/链接?非常感激。
知道了!
这是有关如何启用 CAS REST API 并能够通过 JAVA REST 客户端连接到它以使他人受益的完整解决方案
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-integration-restlet</artifactId>
<version>${cas.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<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>
https://server:8443/cas/login
https://server:8443/cas/v1/tickets
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
成功!
对于 CAS 4.0,它更简单一些(在 apache-tomcat-7.0.55 上测试)
在你的 pom.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,因为排除项可以防止重复的包
在您的 web.xml 中,您需要为 restlet 添加 servlet 映射(mind 包已从 com.noelios.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
// ////////////////////////////////////////////////////////////////////////////////////
通常开发人员在访问安全的 CAS Web 服务时对如何让 REST 客户端正常工作感到困惑。那里的大多数问题都是询问如何让restlet CAS保护网络服务以及如何调用这些网络服务,因为没有真正的例子有效。
那么实际上有。Groovy 示例在 JASIG Cas restlet 示例https://wiki.jasig.org/display/casum/restful+api上清楚地展示了如何通过身份验证来调用服务(它使用 Groovy,但转换为 Java 应该是直截了当的) . 但在我看来,它并没有明确说明客户端在访问 CAS 安全 Web 服务之前需要先对指定的 Web 服务进行身份验证。
例如,假设有一个使用 CAS 保护并使用 Java 和 Spring 构建的 JSON 服务。而且您正在使用在https://wiki.jasig.org/display/casum/restful+api的 groovy 部分中描述的代码
String casUrl="https://yourcas.com/v1/tickets"
String springTicketValidation="http://yourservice.com/j_spring_cas_security_check"
String serviceToCall="http://yourservice.com/serviceToCall"
为了让您的服务客户端能够调用服务,您需要遵循以下简单规则:
或在代码角度
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)
请注意,所有这些操作都应在以下条件下完成:
HttpClient
对象中完成。似乎 CAS 在您调用服务时验证的会话对象中放入了“某些东西”。如果失败,您将始终在 HTTP 结果上获得登录页面。希望这有帮助