请教关于Yale CAS单点登陆的问题

VF 2012-06-27 03:52:42
最近项目中使用到了Yale Cas单点登陆系统,参照官方配置文档配置后可以进行单点登陆

但是碰到以下问题,请教各位前辈:

1、Cas Client采用纯web.xml形式配置,单点登陆没问题,登陆后刷新也没有问题,但是url栏中没有出现ticket参数【https://sso.venumeta.com:8443/venu/】,按照官方解释文档说,验证通过,跳转正常,url中会附加上ticket=xxx的参数,但是目前的测试使用中没有碰到什么异常问题

TicketValidator配置如下:

<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://sso.venumeta.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>https://sso.venumeta.com:8443</param-value>
</init-param>
</filter>


2、Cas Client采用web.xml+Spring方式配置,单点登陆没问题,跳转没问题,url中ticket参数也正常【https://sso.venumeta.com:8443/venu/?ticket=ST-1-ncWS6TkNVKJac2Py6O1E-cas】,但是一刷新页面,就会出现错误,控制台信息如下:

2012-06-27 15:53:29,450 INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - <ServiceTicket [ST-1-ncWS6TkNVKJac2Py6O1E-cas] does not exist.>
2012-06-27 15:53:29,450 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: audit:unknown
WHAT: ST-1-ncWS6TkNVKJac2Py6O1E-cas
ACTION: SERVICE_TICKET_VALIDATE_FAILED
APPLICATION: CAS
WHEN: Wed Jun 27 15:53:29 CST 2012
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

>
[WARN ][2012-06-27 15:53:29.605] org.jasig.cas.client.validation.AbstractTicketValidationFilter - org.jasig.cas.client.validation.TicketValidationException:
未能够识别出目标 'ST-1-ncWS6TkNVKJac2Py6O1E-cas'票根

org.jasig.cas.client.validation.TicketValidationException:
未能够识别出目标 'ST-1-ncWS6TkNVKJac2Py6O1E-cas'票根


TicketValidator配置如下:

web.xml:

<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>ticketValidationFilter</param-value>
</init-param>
</filter>


Spring:

<bean name="ticketValidationFilter" class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter"
p:serverName="${cas.client.appUrl}">
<property name="ticketValidator">
<bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator" p:encoding="UTF-8">
<constructor-arg index="0" value="${cas.server.url}" />
</bean>
</property>
</bean>


根据提示,是说ST票据不存在,但是这个为什么会不存在了呢?奇怪!

这个问题折腾小弟2天了,网上搜索各种资料,但是没发现解决办法,各位前辈大牛,有了解的请指导下小弟,感激不尽!
...全文
4035 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
心如刀割 2014-06-19
  • 打赏
  • 举报
回复
引用 25 楼 love297 的回复:
这楼主纯粹贱人
自由创 2014-04-15
  • 打赏
  • 举报
回复
这楼主纯粹贱人
yuyangjack 2013-11-30
  • 打赏
  • 举报
回复
楼主问题怎么解决的?求科普
对java有感觉 2012-10-23
  • 打赏
  • 举报
回复
大哥别沉啊,帮帮忙!
对java有感觉 2012-10-23
  • 打赏
  • 举报
回复
楼主你解决了能不能分享一下呢?我不清楚就是这个配置我知道了你们说的就是一张票只能用一次嘛下次用就不行了。可是我不知道在那里去配置这个我看了一下 我的服务器好像有ticketExpirationPolicies.xml这个文件。我客户端要改的话是那个地方时jar包吗?还是其他什么配置。还请你帮帮我呢?先谢谢了!
对java有感觉 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
所以:最后的解决方案就是,其它的啥都别动。
在客户端的配置中加入 p:redirectAfterValidation="true"。
万事ok,Filter会帮我们在验证后自动跳转到一个没有ticket参数的页面。不会怕用户去刷页面导致出现问题。
[/Quote]
我想问下客户端那个文件里面配置这个啊
  • 打赏
  • 举报
回复
很奇怪这个是如何有用的 即使修改了还是一样的出现unknown

[Quote=引用 19 楼 的回复:]
引用 17 楼 的回复:

这个问题还是我说的意思,用过的ticket就不能再用了。具体的配置可以看server中的ticketExpirationPolicies.xml这个配置文件(service ticket)。
XML code

<bean id="serviceTicketExpirationPolicy" class="org.jasig.cas.ticket.suppor……
[/Quote]
VF 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

这个问题还是我说的意思,用过的ticket就不能再用了。具体的配置可以看server中的ticketExpirationPolicies.xml这个配置文件(service ticket)。
XML code

<bean id="serviceTicketExpirationPolicy" class="org.jasig.cas.ticket.support.MultiTimeUseOr……
[/Quote]

感谢,十分感谢!
kebushaozi 2012-07-06
  • 打赏
  • 举报
回复
没有遇见过这种问题
宁波朱超 2012-07-06
  • 打赏
  • 举报
回复
嘿嘿SSO啊
nickycheng 2012-07-06
  • 打赏
  • 举报
回复
这个问题还是我说的意思,用过的ticket就不能再用了。具体的配置可以看server中的ticketExpirationPolicies.xml这个配置文件(service ticket)。

<bean id="serviceTicketExpirationPolicy" class="org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy">
<constructor-arg index="0" value="1" />
<constructor-arg index="1" value="10000" />
</bean>

第一个参数表示发放的st用几次后失效,第二个是多久失效。 不信可以改大些、并改多次。这样你再刷页面就不会再报错了,因为服务器认为这个st还是有效的。


再来看客户端的配置。其实我们正常的配置是需要加入 p:redirectAfterValidation="true" 的(看下面的代码),表示从服务器端验证后直接跳转到我们页面,且把ticket参数去掉。 这样就不会出现刷新页面进行二次验证的问题。


<bean name="ticketValidationFilter" class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter"
p:redirectAfterValidation="true"
p:serverName="${cas.client.appUrl}">
<property name="ticketValidator">
<bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator" p:encoding="UTF-8">
<constructor-arg index="0" value="${cas.server.url}" />
</bean>
</property>
</bean>



所以:最后的解决方案就是,其它的啥都别动。
在客户端的配置中加入 p:redirectAfterValidation="true"。
万事ok,Filter会帮我们在验证后自动跳转到一个没有ticket参数的页面。不会怕用户去刷页面导致出现问题。
VF 2012-07-06
  • 打赏
  • 举报
回复
有没有兄弟碰见过啊,头大
VF 2012-06-28
  • 打赏
  • 举报
回复
顶上去啊,有熟悉这方面内容的大拿帮忙吗?
VF 2012-06-27
  • 打赏
  • 举报
回复
CAS里的实现原理中,ticket直接放到url后是正常的,实现原理就是这样的
VF 2012-06-27
  • 打赏
  • 举报
回复
你也碰到这个问题了?那你是怎么解决的?

你的想法没错,ticket是有时间性的,但是我看了官方文档说,应该不会马上删除,而只会标记过期

但是我现在这个后台报的是票据不存在<ServiceTicket [ST-1-ncWS6TkNVKJac2Py6O1E-cas] does not exist.>

你的是这个吗?
nickycheng 2012-06-27
  • 打赏
  • 举报
回复
我以为这个票据是临时性验证用的,服务器会在使用过或是短时间内就删掉它,所以你再次刷新就会报错了。

我也是碰到这个问题,我的想法和你不同,我是在想,登录成功后跳转不应该把这个票据信息放到url里面呀,应该是哪里忽略了,导致ticket参数放到了url里。
VF 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

Java code

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.……
[/Quote]

这个肯定是有的嘛,不然就没有登录成功一说了,登录成功后有Filter加载用户信息到客户端session,这个已经弄了,没问题
谁是莫默的呢 2012-06-27
  • 打赏
  • 举报
回复
没玩过,楼下继续,学习
luojitao1020 2012-06-27
  • 打赏
  • 举报
回复

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.jasig.cas.client.validation.Assertion;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.wsria.demo.entity.account.User;
import com.wsria.demo.service.account.UserManager;
import com.wsria.demo.util.UserUtil;


/**
* 自动根据单点登录系统的信息设置本系统的用户信息
*
* @author 咖啡兔
* @site www.wsria.cn
*
*/
public class AutoSetUserAdapterFilter implements Filter {

/**
* Default constructor.
*/
public AutoSetUserAdapterFilter() {
}

/**
* @see Filter#destroy()
*/
public void destroy() {
}

/**
* 过滤逻辑:首先判断单点登录的账户是否已经存在本系统中,
* 如果不存在使用用户查询接口查询出用户对象并设置在Session中
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;

// _const_cas_assertion_是CAS中存放登录用户名的session标志
Object object = httpRequest.getSession().getAttribute("_const_cas_assertion_");

if (object != null) {
Assertion assertion = (Assertion) object;
String loginName = assertion.getPrincipal().getName();
User user = UserUtil.getCurrentUser(httpRequest.getSession());

// 第一次登录系统
if (user == null) {
WebApplicationContext wct = WebApplicationContextUtils.getWebApplicationContext(httpRequest
.getSession().getServletContext());
UserManager userManager = (UserManager) wct.getBean("userManager");
user = userManager.findUserByLoginName(loginName);
// 保存用户信息到Session
UserUtil.saveUserToSession(httpRequest.getSession(), user);
}

}
chain.doFilter(request, response);
}

/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
}

}


这个是google开源社区的一个单点登录实例 我是参考的这个弄的..
luojitao1020 2012-06-27
  • 打赏
  • 举报
回复
稍等 我把代码贴给你..
加载更多回复(6)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧