2012-05-31 47 views
0

在我當前的項目中,我們有一組服務類,它們受基於方法的安全性的保護。我如何創建方法安全保護的DAO的安全和不安全版本

現在在某些情況下,「系統」需要自行調用安全方法。 (例如:一個用戶離開一個頻道,並且該頻道由於其空閒而被隱式關閉,通常'關閉'被保護)。

如何以安全和不安全的方式同時訪問服務類?

編輯 - 短示例

auhentication期間,系統檢查是否在這裏是相對於用戶的有源禁令。

public User authenticate(String name, String token) throws BadCredentialsException, RuntimeException { 
    User user = get(name); 
    if (user == null || !user.getToken().equals(token)) { 
     throw new BadCredentialsException("Invalid Project/Username/Password"); 
    } 
    Ban userBan = banService.getBanForUser(user); 
    if (userBan != null) { 
     throw new UserBannedException("User was baned", userBan); 
    } 
    return user 
} 

但獲得任何禁令是基於方法的安全保護,因此不是每個用戶都可以「搞定」他們。

@PreAuthorize("isAuthenticated()") 
public Ban getBanForUser(User user) { 
    return ... 
} 

所以基本上我需要兩種方法來訪問此方法。一個由spring-security inteceptor保護(對於「用戶」),另一個不是(對於「系統」)。

這可能沒有包裝類,繼承魔術,...

這將是巨大的,如果我可以定義具有相同的類一個帶彈簧的安全性和一個內部消除兩個彈簧豆。

+0

您可以根據角色的基礎上保護方法,如果ROLE_SUPER然後給訪問'接近()'方法,或者如果其他角色再保護,同時提供更多的細節,以便我們可以幫助你。 –

+0

@Nandkumar我添加了一個簡短的例子。 – Laures

回答

1

解決方案(當然,沒有任何東西接近優雅的東西)將在您調用受保護的方法之前模擬超級用戶的身份驗證。事情是這樣的:

SecurityContextHolder.getContext().setAuthentication(privileged user here);  
Ban userBan = banService.getBanForUser(user); 
SecurityContextHolder.getContext().setAuthentication(null); 
+0

目前我做類似的事情,但我保留原來的上下文,所以我可以在通話後恢復它。 – Laures