10

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

但是没有Java示例

“Java REST 客户端示例

我们需要一个真实的、有效的例子,前一个是没用的。许多人给我发电子邮件说它不起作用,我确认它不起作用。”

我能够找到这个,但不幸的是这对我不起作用。

任何指针/链接?非常感激。

4

4 回答 4

18

知道了!

这是有关如何启用 CAS REST API 并能够通过 JAVA REST 客户端连接到它以使他人受益的完整解决方案

  • 获取 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 代码。应该在您的目标文件夹中获得 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>

<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.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.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 日志,您应该会看到有关成功认证和票证生成的消息。
  • 将用户名/密码更改为一些虚拟数据并尝试运行代码。您将收到 400 错误消息,这意味着访问权限被拒绝。

成功!

于 2014-03-25T16:54:52.063 回答
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 映射(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
于 2014-10-01T10:00:48.163 回答
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
// ////////////////////////////////////////////////////////////////////////////////////
于 2014-03-25T21:49:40.900 回答
2

通常开发人员在访问安全的 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"

为了让您的服务客户端能够调用服务,您需要遵循以下简单规则:

  1. 从 CAS 获取授权票
  2. 从 cas 获取您的 Service Ticket 以获取指定的服务调用(service to call)
  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. 本示例基于 CAS 安全 Web 服务,使用 Spring Security 来使用 CAS 保护服务。我不确定其他 cas 安全是否需要在应用程序端进行票证验证

希望这有帮助

于 2014-06-30T09:27:38.220 回答