我有两个应用程序在两个不同的服务器上运行(一个在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.
答案 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对象,AttributePrincipal
是cas-client-core-3.3.3.jar
然后,可以将此proxyTicket作为查询字符串附加到您的Web服务的URL中,如下所示:
https://myother-webservice-app.com/ws/myData?ticket=<proxyTicket>
构建此URL后,您可以通过编程方式进行Web服务调用。
希望这有帮助。