我想在我的项目中实现对象级权限。更具体地说,将有一个用户,一个学校和一个学生班。每个学生都属于一所学校。系统的每个用户也将属于学校。因此,系统的每个用户只能访问属于他所在学校的学生。
我已经在很多地方读到过这可以在spring security ACL的帮助下完成。这需要在我的数据库中创建多个ACL_表(如果我没有错误,则为4个)并且对每个对象都有特定的权限!所以我的ACL_ENTRY中有尽可能多的对象!
这对我的应用程序来说太过分了,因为对象已经知道谁拥有并且无法访问它 - 为什么我还需要额外的acl_entry?我想要的是检查要更新的对象是否属于特定用户并返回是否允许。选择也是如此 - 只返回属于特定用户的对象。
根据我的理解,这必须在我的数据访问层中完成 - 如果我在其他任何地方都这样做我会遇到查询问题(因为我需要逐个检查所有对象以查看它们是否存在属于特定用户)。对于我的数据访问,我使用spring-data,其接口扩展了JpaRepository。我可以添加自己的方法进行保存/选择吗?如何从这些方法中获取User对象?为了帮助我开始,有没有人做过类似的事情?
答案 0 :(得分: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.
您可以通过以下两种方式验证学生对象。
如果您的方法返回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("******");
}
在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