2014-01-31 79 views
0

我正在使用GWT寫我的應用程序。在我的應用中有兩個角色(ROLE_USER和ROLE_ADMIN)。 ROLE_ADMIN能夠得到某種處理@Preauthorize in GWT

@Service 
@PreAuthorize("hasAnyRole('ROLE_ADMIN')") 
public class GetAuditDataListHandler extends AbstractActionHandler<GetAuditDataListAction, GetAuditDataListResult> { 
// Code here 
} 

當我嘗試ROLE_USER下訪問我想顯示對話框(「拒絕訪問」!)。但它返回500服務器上的呼叫失敗;看到服務器日誌的詳細信息

com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:209) 
com.test.web.main.api.client.AuthRemoteServiceProxy$1.onResponseReceived(AuthRemoteServiceProxy.java:74) 
com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258) 
com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:606) 
com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 
com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 
com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 
com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338) 
com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219) 
com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136) 
com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571) 
com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279) 
com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91) 
com.google.gwt.core.client.impl.Impl.apply(Impl.java) 
com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242) 
sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:606) 
com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 
com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 
com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 
com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) 
com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547) 
com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) 
java.lang.Thread.run(Thread.java:744) 

回答

1

春天將檢查安全角色和執行處理程序之前拋出異常。

您通常能夠在Request的客戶端onFailure()方法中捕獲此異常,但拋出的異常可能不可序列化或很可能不適用於GWT客戶端代碼,並且無法序列化 - 導致錯誤。

看起來你正在使用gwt-dispatch庫?我有一段時間沒有使用過,但你可以覆蓋SpringSecureDispatchServlet並添加你自己的doUnexpectedFailure(Throwable e)方法的實現。在那裏你可以檢查異常,看看它是否是Spring安全異常,而不是調用返回狀態碼500的RPCServletUtils.writeResponseForUnexpectedFailure(...)實現你自己的返回更合適的錯誤代碼(401或403)。

+0

是的,我正在使用gwt-dispatch。我發現org.springframework.security.access.AccessDeniedException引發至com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet#doUnexpectedFailure。我不知道該怎麼辦。 – Mufanu

+0

我已經更新了我的答案。我沒有試過這個,也不知道這是否是最好的方法,但是這樣的事情應該是可行的。 – pauli

+0

我想在哪裏放置SpringSecureDispatchServlet?我找不到SpringSecureDispatchServlet。 – Mufanu

0

難道你不能添加一個Servlet過濾器來捕獲這個特殊的異常,並將它變成你想要的HTTP響應嗎?

+0

我試圖添加過濾器,但它不適用於我 – Mufanu