春天安全+记住我的问题+检票口

时间:2010-05-24 22:21:20

标签: security spring wicket

我正在使用wicket 1.4.7 + spring 3.0 + spring security 3.0

问题是:Spring安全性通过cookie(记住我的服务)验证用户,但是Wicket的AuthenticatedWebSession无法理解这一点并填充登录面板。我该如何解决?

感谢。

1 个答案:

答案 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中复制一些代码就可以使一切工作类似。