Довольно старый вопрос, но я наткнулся на него во время исследования точно такой же проблемы. Так что, если кто-то еще сталкивался с этим, вот мое решение.
Проблема в том, что AuthenticatedWebSession # isSignedIn () игнорирует SecurityContext и вместо этого проверяет свой собственный логический флаг. Поскольку невозможно переопределить последний метод #isSignedIn (), должен быть обходной путь. Я выбрал пользовательский WebRequestCycle, переопределяющий #onBeginRequest (), для синхронизации состояния непосредственно перед тем, как Wicket начинает обрабатывать текущий запрос:
// 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-ролей не требуют их. Для того, чтобы все работало одинаково, требуется только некоторое дублирование кода от AuthenticatedWebApplication.