2010-05-24 60 views
0

我使用的檢票1.4.7 +彈簧3.0 +彈簧安全3.0春季安全+還記得我的問題+檢票

問題是:春季安全通過cookie的認證用戶(記住我服務),但Wicket的AuthenticatedWebSession couldn」理解這一點並填充登錄面板。我如何解決它?

謝謝。

回答

1

很古老的問題,但我在研究完全相同的問題時偶然發現了它。所以如果有人遇到這個問題,這是我的解決方案。

問題是AuthenticatedWebSession#isSignedIn()忽略SecurityContext並且檢查它自己的布爾標誌。由於不可能重寫最終方法#isSignedIn(),所以必須有一種解決方法。我已經走了一個自定義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可拋棄產品總數爲檢票認證 - 角色的休息不需要它們。它只需要從AuthenticatedWebApplication進行一些代碼複製,以使所有的工作都能以相似的方式工作。