2013-09-25 274 views
0

我想在我的項目中實現對象級權限。更具體地說,會有一個用戶,一個學校和一個學生班。每個學生將屬於一所學校。系統的每個用戶也將屬於一所學校。因此,系統的每個用戶只能訪問屬於他學校的學生。沒有彈簧安全性的彈簧對象級權限ACL

我讀過很多地方,這可以在彈簧安全ACL的幫助下完成。這需要在我的數據庫中創建一些ACL_表(如果我沒有錯,則爲4),並且對每個對象都有特定的權限!所以我會在ACL_ENTRY中擁有許多行作爲許多對象!

這是對我的應用程序的矯枉過正,因爲對象已經知道誰有和沒有訪問它 - 爲什麼我還需要一個額外的acl_entry?我想要的是檢查要更新的對象是否屬於特定用戶,並返回允許或不允許。選擇同樣如此 - 只返回屬於特定用戶的對象。

從我能理解,這在我的數據訪問層做 - 如果我去做了其他地方我有疑問的問題(因爲我需要檢查所有對象逐一看看他們屬於特定用戶)。對於我的數據訪問,我使用了spring-data以及擴展JpaRepository的接口。我可以添加我自己的保存/選擇方法嗎?我如何從這些方法獲取用戶對象?有沒有人做過類似的事情來幫助我開始?

回答

2

只是一個嘗試。您可以通過在應用程序中實現Spring AOP來實現對象級別的安全性。根據您的要求,我將在此提供一個示例。

//之前用戶模型訪問

@Before("within(org.school.model.*)") 
public void doCheckSchoolUsers() throws <any custom exception or Exception class> 
{ 
//Write your code here to get the current user and validate the user based on your business requirements. 
if(the user is not authorized) 
     throw new Exception<or your custome exception> //You can catch this  exception any of your filter and redirect accordingly. 

執行您可以驗證你的學生對象在以下兩個方面。

  1. 如果你的方法返回Student對象或某個對象的集合一起,你可以捕捉所有由該方法返回的對象。

    @AfterReturning(pointcut = "execution(* 
    com.mkyong.customer.bo.CustomerBo.addCustomerReturnValue(..))",returning= "result") 
    public void logAfterReturning(JoinPoint joinPoint, Object result) 
    { 
    System.out.println("logAfterReturning() is running!"); 
    System.out.println("hijacked : " + joinPoint.getSignature().getName()); 
    System.out.println("Method returned value is : " + result); 
    System.out.println("******"); 
    

    }

  2. 獲取PARAMS在AOP法。

    public String log(ProceedingJoinPoint jp) throws Throwable 
    { 
         System.out.println("Spring AOP: Around advice"); 
         Object[] args=jp.getArgs(); 
         if(args.length>0){ 
         System.out.print("Arguments passed: "); 
         for (int i = 0; i < args.length; i++) { 
          System.out.print("Arg"+(i+1)+":"+args[i]); 
          args[i]=":Spring AOP removed the argument"; 
         } 
        } 
        Object result=jp.proceed(args); 
        return result.toString()+" :Result is also modified"; 
    } 
    

有關詳細信息:http://docs.spring.io/spring/docs/2.5.5/reference/aop.html

+0

看上去不錯,但選擇時,如何過濾我的結果嗎?另外,如何在AOP方法中找到Student對象*?我對AOP不是很熟悉:( – Serafeim

+0

請看我的更新回答 –

+0

數據訪問過濾如何? – Serafeim