CAS:从servlet中以编程方式调用Web服务

时间:2015-02-18 12:50:04

标签: java web-services servlets cas

我有两个应用程序在两个不同的服务器上运行(一个在tomcat上,另一个在JBoss上)。这两个应用程序都连接到同一CAS服务器进行身份验证。现在这个CAS服务器也驻留在同一个JBoss中。

Say:
App-1 --- is on tomcat and CASified
App-2 --- is on JBoss and CASified
CAS   --- is on JBoss

现在我正在从浏览器调用App-1的URL。 CAS登录页面出现,在提供用户名/密码后,请求现在成功进入App-1的servlet。从这个servlet代码,我试图调用驻留在App-2中的Web服务。

Note: I use axis2 for this webservice and the axis2.war is also CASified
      to the same CAS server for authentication.

无论我做什么,我都无法使这个网络服务呼叫工作。有没有办法实现这个目标?

Note: If I call the CAS REST api with a hardcoded username/password, I am 
getting the TGT, through which I am able to get the Service Ticket, with 
which I am able to invoke that web-service. But I do not want to login again 
with a hard-coded username or password. My webservice invocation should 
happen with the already logged-in user only. 

2 个答案:

答案 0 :(得分:0)

当您在App-2上调用Web服务时,您是否收到会话cookie?这应该是您在没有重新认证每次通话的情况下继续访问的机制。如果您没有收回cookie,那么无法在没有进行身份验证的情况下继续访问(即,服务器无法记住它是否为您它应该信任其余信息。)

答案 1 :(得分:0)

使用CAS代理功能可以实现这一点。 链接 https://wiki.jasig.org/display/CAS/Proxy+CAS+Walkthrough 帮了一下。但无法理解从哪里开始。 首先从http://downloads.jasig.org/cas-clients/获取CAS客户端jar。在我的情况下,我拿了cas-client-core-3.3.3.jar jar。我已将此jar包含在我的应用程序之战中。 在我的应用程序的web.xml中,我包含了以下3个CAS过滤器。

<!-- CAS Filters -->
<filter>
    <filter-name>CAS Validation Filter</filter-name>
    <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>https://cas-hostname.domainname:port/cas</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>https://app-hostname.domainname:port</param-value>
    </init-param>
    <init-param>
        <param-name>proxyCallbackUrl</param-name>
        <param-value>https://app-hostname.domainname:port/app/ticket</param-value>
    </init-param>
    <init-param>
        <param-name>proxyReceptorUrl</param-name>
        <param-value>/app/ticket</param-value>
    </init-param>
</filter>


<filter>
    <filter-name>CAS Authentication Filter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://cas-hostname.domainname:port/cas/login</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>https://app-hostname.domainname:port</param-value>
    </init-param>
</filter>


<filter>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>

  <!-- filter mappings -->
<filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/app/*</url-pattern>
    <url-pattern>/ticket</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>CAS Authentication Filter</filter-name>
    <url-pattern>/app/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <url-pattern>/app/*</url-pattern>
</filter-mapping>
  

注1:过滤器映射的顺序应如上所述。   应该首先进行CAS验证过滤器映射,然后是CAS   身份验证过滤器并持续CAS HttpServletRequest Wrapper   过滤

     

注意2:URL模式/票证基本上是您的代理回调   在最后两个过滤器中不需要提及url。

在使用这些过滤器配置的web-app和web.xml中包含CAS客户端jar后,所有http请求都会通过这些过滤器。

因此,一旦您的http请求进入您的servlet,您就可以调用以下代码片段来获取代理票证:

String proxyTicket = ((AttributePrincipal) req.getUserPrincipal())
                .getProxyTicketFor(webservice_url);

req是HttpServletRequest对象,AttributePrincipalcas-client-core-3.3.3.jar

中的一个类

然后,可以将此proxyTicket作为查询字符串附加到您的Web服务的URL中,如下所示:

https://myother-webservice-app.com/ws/myData?ticket=<proxyTicket>

构建此URL后,您可以通过编程方式进行Web服务调用。

希望这有帮助。