我正在使用wicket 1.4.7 + spring 3.0 + spring security 3.0
问题是:Spring安全性通过cookie(记住我的服务)验证用户,但是Wicket的AuthenticatedWebSession无法理解这一点并填充登录面板。我该如何解决?
感谢。
答案 0 :(得分:1)
很老的问题,但我在研究完全相同的问题时偶然发现了它。所以如果有其他人遇到这个,这是我的解决方案。
问题是AuthenticatedWebSession#isSignedIn()忽略SecurityContext并检查它自己的布尔标志。由于无法覆盖最终方法#isSignedIn(),因此必须有一种解决方法。在Wicket开始处理当前请求之前,我已经选择了一个自定义的WebRequestCycle覆盖#onBeginRequest()来同步状态:
// MyApplication.java
public MyApplication extends AuthenticatedWebApplication {
// SNIP
@Override
public RequestCycle newRequestCycle(final Request request, final Response response) {
return new WebRequestCycle(this, (WebRequest) request, (WebResponse) response) {
@Override
protected void onBeginRequest() {
MySession.get().updateSignIn();
}
};
}
}
// MySession.java
public class MySession extends AuthenticatedWebSession {
// SNIP
void updateSignIn() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
signIn(auth != null && auth.isAuthenticated());
}
}
或者,AuthenticatedWebSession和AuthenticatedWebApplication可以完全放弃,因为其他wicket-auth-roles不需要它们。它只需要从AuthenticatedWebApplication中复制一些代码就可以使一切工作类似。