2016-11-17 63 views
0

我已經使用spring acl插件來添加對象的權限,以便擁有一個對象的用戶不能訪問另一個用戶擁有的對象。即使在用戶已經登錄後,通過spring acl插件重定向到登錄頁面?

在許多控制器更新方法,我要檢查寫權限可在執行該操作的用戶,以便第一行通常是

myAclService.hasWritePermission(id, Event) 

如果此方法將拋出拒絕訪問異常未找到權限。

現在我的困境是,即使在用戶登錄並且控制器方法被擊中後,用戶通常也會被重定向到登錄頁面。這是春季安全插件導致此行爲的一個弱點。我想知道,如果用戶已經登錄,是否可以防止這種重定向?是否有其他人使用彈簧插件有相同的問題?我感謝任何幫助!謝謝!

回答

0

您可以爲AccessDeniedException添加自定義處理程序。有更多的方法來做到這一點。一種方法是:通過用@ControllerAdvice註解類並添加異常處理方法來爲所有控制器創建全局處理程序。

@ExceptionHandler(AccessDeniedException.class) 
public void handleAccessDenied() { 
    if (SecurityContextHolder.getContext().getAuthentication() != null && 
     SecurityContextHolder.getContext().getAuthentication().isAuthenticated() && 
     //when Anonymous Authentication is enabled 
     !(SecurityContextHolder.getContext().getAuthentication() 
      instanceof AnonymousAuthenticationToken)) { 
      // do nothing 
     } else { 
      throw new MyCustomException(); 
     } 
    } 

    @ExceptionHandler(MyCustomException.class) 
    public String handleAccessDeniedForNotLoggedInUser() { 
    return "redirect:/login"; 
    } 

而且我相信這將是更具可讀性在規劃環境地政司使用ACL表達式。 如果您通過Spring準則設置ACL,則可以使用類似@PreAuthorize("hasPermission(#event, 'WRITE')")的表達式來註釋控制器方法,並且我相信Spring會默默地吃掉這些異常並且不會發生重定向。

相關問題