2011-07-08 30 views
4

考慮一些基本的授權框架User s和Group s應該通過檢查來保護對方法的訪問,這些檢查確保用戶或組具有必要的PriviledgeLevel來執行該方法並且否則將失敗。是否可以使用註釋實現方法級訪問檢查?

我想象的是這樣的:

@AccessCheck(PriviledgeLevel.ADMINISTRATOR) 
public static void secureMethod(){ ... } 

當代碼檢查基本上沒有

if(currentUser.getPriviledgeLevel >= PriviledgeLevel.ADMINISTRATOR || 
    currentUser.getGroup.priviledgeLevel >= PriviledgeLevel.ADMINISTRATOR) 
    // Allow access 
else 
    // Deny access  

是否有可能實現這種方式?

我做了一些研究,指出基於AspectJ的一些現有事物,主要是Security Annotation Framework(SAF)和Spring Security

我有點擔心,因爲SAF不再那麼活躍,文檔也不是很好。

我不確定Spring Security,但它似乎更關注與Web相關的主題中的安全問題。

Java Authentication and Authorization Service似乎是相關的,但不使用註釋方法。

試圖用這種聲明式方法來定義這些安全需求是否有意義?

是否有另一個圖書館/框架我想念,已經實現了我想要的或一些技術在這裏將是相關的?

還是有一個完全不同的解決方案(比如實現我自己的ClassLoader,...),它優於我想象的(就圖書館用戶的簡潔性和可讀性而言)?

+0

Spring Security是一個自下而上的解決方案,它不僅專注於Web相關的安全性。事實上,我在開始使用Spring安全軟件之前,還沒有在網絡安全中使用它。 – bluefoot

回答

1

我認爲AspectJ會做你想做的事情。我們有一大堆你需要某些訪問權限的方法,並且我們已經創建了一個AspectJ方面,如果用戶沒有這些權限,它將檢查和錯誤。

作爲一個加號,因爲AspectJ在編譯時被「編織」到類中,所以它不能被配置禁用。

我們也使用Spring Security,它可以協調使用!

1

你可以通過使用動態代理來很簡單地做到這一點。

public interface MyInterface { 
      @AccessCheck(Privilege.ADMIN) 
      public void doSomething(); 
} 

代理將在實現您的接口的類上創建,並且您將使用自定義註釋來註釋接口。

MyInterface aInterface = (MyInterface) java.lang.reflect.Proxy.newProxyInstance(obj.getClass() 
       .getClassLoader(), obj.getClass().getInterfaces(), 
       new YourProxy(new Implementation()); 

在你代理的invoke()方法,你可以檢查,如果你的方法有註釋和拋出SecurityException如果權限沒有得到滿足。

public YourProxy implements InvocationHandler { 
     .... 
     public Object invoke(Object proxy, Method method, Object[] args) 
     throws Throwable { 

       if (method.isAnnotationPresent(AccessCheck.class) { 
        ....// do access check here and throw SecurityException() 
     } 
} 
1

隨着Spring Security,你只需要添加:

@Secured("ADMINISTRATOR") 
public static void secureMethod(){ ... } 

並正確配置它,方法是:

  1. 使用JdbcDaoImpl爲您UserDetailsService
  2. enable group support
  3. 自定義查詢(如您正在使用數據庫憑證存儲)

如果你不使用數據庫證書存儲裝置,只需配置首選UserDetailsService到用戶和組憑據添加到生成UserDetails當局。

在沒有檢查documentation的概念的情況下,很難理解它,但方法級訪問檢查對於彈簧安全性來說是完全可能的,並且它是我的首選技術。

+1

是的,Spring Security使工作變得輕鬆而且非常靈活,你幾乎可以在任何地方配置行爲,對於web應用程序,它是(默認),但你可以通過模式和jsp片段保護方法調用,url。當然,你可以擴展它來以你自己的方式實現安全 –

0

在Spring Security中,作爲the docs狀態,可以在方法級別使用@Secured@PreAuthorize

要啓用@PreAuthorize(如果您還沒有...),則需要將<global-method-security pre-post-annotations="enabled" /> 置於您的配置XML中;對於@Secured使用<global-method-security secured-annotations="enabled" />。請參閱this article

相關問題