2013-09-25 194 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