【问题标题】:Working Java REST Client Example to access CAS REST API工作 Java REST 客户端示例以访问 CAS REST API
【发布时间】:2014-03-25 04:19:50
【问题描述】:

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

但是没有 Java 示例

"Java REST 客户端示例

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

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

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

【问题讨论】:

    标签: rest cas jasig


    【解决方案1】:

    知道了!

    这是关于如何启用 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>

    <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
    • 现在让我们连接到它。我使用了this 示例代码。确保提供正确的链接和用户名/密码
    • 当我尝试按原样运行代码时,它抱怨“原因:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径”。基本上要求您安装证书。如果您有权访问服务器,只需将其复制过来。如果没有,我找到了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 = "myserver.com/testApplication";行...如果是这种情况,它应该是指您的请求应用程序,它要求 CAS 对当前用户进行身份验证。查看这个网站:wiki.jasig.org/display/CAS/Proxy+CAS+Walkthrough 在第一步中,您可以看到他们的解释:(服务是虚构的,因为您所追求的票是 url 的一部分,甚至会出现在位置栏中如果您的浏览器找不到资源。
    • 还可以查看本网站,了解关于 CAS purdue.edu/apps/account/html/cas_presentation_20110407.pdf 的分步操作。这应该使您很好地了解该过程中涉及的步骤。希望对您有所帮助...感谢您的反馈!
    • 是的,这就是我的意思!谢谢。因此,如果我理解正确,无论服务是否存在,我都可以获得票证。在我的情况下,我没有示例应用程序,我只想测试 CAS 服务器。所以如果服务 url 指向不存在的东西都没关系.. 对吗?
    • 是的。正确,您仍然可以测试 CAS 并取回票证,并且您不需要实际使用此票证的服务。
    【解决方案2】:

    对于 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
    

    【讨论】:

      【解决方案3】:

      如果您希望跳过证书验证,请将其添加到您的 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
      // ////////////////////////////////////////////////////////////////////////////////////
      

      【讨论】:

        【解决方案4】:

        在访问安全的 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. 向您的服务票证验证器进行身份验证(此时 url 在 springTicketValidation 上指定)
        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 是否需要在应用程序端进行票证验证

        希望有帮助

        【讨论】:

          猜你喜欢
          • 2017-10-10
          • 2012-01-06
          • 2018-01-24
          • 1970-01-01
          • 1970-01-01
          • 2021-01-23
          • 2023-03-15
          • 1970-01-01
          • 2019-04-13
          相关资源
          最近更新 更多