访问CAS REST API的Java REST客户端示例演示

10

我按照这个教程在本地的CAS服务器上启用了REST服务。

然而,没有Java示例。

"Java REST客户端示例"

我们需要一个真正可行的示例,之前的无用。许多人给我发电子邮件说它不起作用,我确认它确实不起作用。"

我找到了这个,但很遗憾对我来说也没有用。

有什么指针/链接吗?非常感谢。

4个回答

18

明白了!

以下是完整的解决方案,说明如何启用CAS REST API并通过JAVA REST客户端连接以使他人受益。

  • 获取CAS源代码。
  • 查看this文章
  • 像文章#2所建议的那样,在pom.xml中添加以下内容:

<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代码。应在目标文件夹中获得cas.war。
  • 将其上传到服务器,更改权限为tomcat,并等待部署
  • 在CATALINA / conf中找到server.xml并取消注释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>

restlet /v1/*
  • 重启Tomcat以使更改生效。
  • 测试您是否可以通过标准CAS UI登录:https://server:8443/cas/login
  • 测试REST API是否已通过以下方式公开:https://server:8443/cas/v1/tickets
  • 现在让我们连接它。我使用了this示例代码。请确保提供正确的链接和用户名/密码。
  • 当我尝试按原样运行代码时,它会抱怨“Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”。基本上是要求您安装证书。如果您可以访问服务器,请将其复制过来。如果没有,我找到了this代码,如果您没有权限或只是太懒,它将为您处理安装。
  • 现在,如果您使用有效凭据运行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的日志,则应该看到有关成功身份验证和票证生成的消息。
  • 将用户名/密码更改为一些虚拟数据,然后尝试运行代码。您将收到400错误消息,这意味着访问权限被拒绝。

成功!


我假设你指的是String serviceURL = "https://myserver.com/testApplication";这一行代码... 如果是这样的话,它应该是指向请求CAS进行当前用户认证的应用程序。请查看此网站:https://wiki.jasig.org/display/CAS/Proxy+CAS+Walkthrough 在第一步中,您可以看到他们的解释:(服务是虚构的并不重要,因为您要获取的票证是URL的一部分,即使您的浏览器找不到资源,它也会出现在位置栏中)。 - krinker
还有,请查看这个网站,了解CAS的逐步操作 https://www.purdue.edu/apps/account/html/cas_presentation_20110407.pdf。这应该能让您对整个过程有一个很好的理解。希望它能帮到您... 谢谢您的反馈! - krinker
是的,这就是我的意思!谢谢。所以如果我理解正确,无论服务是否存在,我都可以获得票据..在我的情况下,我没有一个样例应用程序,我只想测试CAS服务器。所以,如果服务URL指向不存在的内容,也没关系,对吗? - fnkbz
是的。没错,您仍然可以测试CAS并获取票据,而且您不需要一个实际使用此票据的服务。 - krinker
这是一个很好的解决方案,可以获取票证并测试您的服务器。但是如果没有cookie管理,如何访问受保护的资源(即myserver.com/testApplication)?如果我个人测试>myserver.com/testApplication?ticket=ST-4-BZNVm9h6k3DAvSQe5I3C-server_name,则会得到302。 - biology.info
显示剩余4条评论

5

对于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映射(注意包名已从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>  

由于上述步骤,您的 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

2
通常,当访问受保护的CAS Web服务时,开发人员会对如何使rest客户端工作感到困惑。 大多数问题都是关于如何获取restlet CAS来保护Web服务以及如何调用这些Web服务,因为没有真正的示例可供使用。
实际上,有一个Groovy示例在JASIG Cas restlet示例https://wiki.jasig.org/display/casum/restful+api中清楚地展示了如何进行身份验证以调用服务(它使用Groovy,但转换为Java应该很直接)。 但是,在我看来,它没有明确解释客户端需要先认证指定的Web服务才能访问CAS安全的Web服务。
例如,假设有一个JSON服务,它受CAS保护,使用Java和Spring构建。 您正在使用在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"

要使您的服务客户端能够调用服务,您需要遵循以下简单规则:
  1. 从CAS获取您的票据授权票
  2. 为指定的服务调用(要调用的服务)从CAS获取您的服务票据
  3. 对您的服务票据验证器进行身份验证(此时在springTicketValidation上指定的URL)
  4. 最后调用您的服务
或者从代码角度来看:
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)

请注意,所有这些操作都应在以下条件下完成:

  1. 您的调用(包括 Restlet 调用和服务调用)应该在同一个 HttpClient 对象中完成。似乎 CAS 在会话对象中放置了“某些东西”,当您调用服务时进行验证。如果失败,则始终会在 HTTP 结果中获取登录页面。
  2. 您的 CAS 客户端应该能够识别您的 CAS SSL 证书,否则它将抛出 PKIX 路径构建失败。
  3. 此示例基于使用 Spring Security 保护带有 CAS 的安全 Web 服务。我不确定其他受 CAS 保护的服务是否需要在应用程序侧进行票证验证。

希望这可以帮助你。


2
如果您希望跳过证书验证,请在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
// ////////////////////////////////////////////////////////////////////////////////////

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接