Разрешения уровня объекта Spring без ACL безопасности Spring
Я хочу реализовать разрешения уровня объекта в моем проекте. Точнее, будет класс пользователя, школы и студента. Каждый ученик будет принадлежать одной школе. Каждый пользователь системы также будет принадлежать школе. Таким образом, каждый пользователь системы будет иметь доступ только к ученикам своей школы.
Я читал в нескольких местах, что это можно сделать с помощью ACL Spring Security. Для этого необходимо создать несколько таблиц ACL_ в моей базе данных (4, если я не ошибаюсь) и иметь определенные разрешения для каждого из моих объектов! Поэтому в моем ACL_ENTRY будет столько строк, сколько объектов!
Это избыточно для моего приложения, так как объект уже будет знать, кто имеет и не имеет к нему доступа - зачем мне также дополнительный acl_entry? Что я хочу, так это проверить, принадлежит ли объект, который будет обновлен, конкретному пользователю и вернуть или разрешить, или нет. То же самое касается выбора - просто вернуть объекты, принадлежащие конкретному пользователю.
Из того, что я могу понять, это должно быть сделано на моем уровне доступа к данным - если я сделаю это где-нибудь еще, у меня возникнут проблемы с запросами (так как мне нужно будет проверить все объекты один за другим, чтобы увидеть, принадлежат ли они конкретный пользователь). Для доступа к данным я использую spring-data с интерфейсами, расширяющими JpaRepository. Могу ли я добавить свои собственные методы для сохранения / выбора? Как я могу получить объект User из этих методов? Кто-нибудь сделал что-то подобное, чтобы помочь мне начать?
1 ответ
Просто попробуйте. Вы можете обеспечить безопасность на уровне объекта, внедрив в своем приложении 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