Можно ли реализовать проверки доступа на уровне метода с аннотациями? - PullRequest
4 голосов
/ 08 июля 2011

Рассмотрим некоторую базовую структуру авторизации с 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, но, похоже, он больше сосредоточен на проблемах безопасности в темах, связанных с вебом.

Служба аутентификации и авторизации Java *1027*, похоже,быть связанным, но не использовать подход аннотации.

Имеет ли смысл пытаться определить эти требования безопасности с помощью этого декларативного подхода?

Есть ли еще одна библиотека / каркас, который мне не хватает,который уже реализует то, что я хочу, или какую-то технологию, которая была бы здесь уместна?

Или есть совершенно другое решение (например, реализация моего собственного ClassLoader, ...), которое превосходит то, что я представляю (вусловия краткости и читабельности для пользователя библиотеки)?

Ответы [ 4 ]

1 голос
/ 08 июля 2011

Я думаю, что AspectJ сделает то, что вы от него хотите.У нас есть целый ряд методов, для которых вам нужны определенные права доступа, и мы создали аспект AspectJ, который проверит это и выдаст ошибку, если у пользователя нет таких разрешений.«вплетен» в классы во время компиляции, его нельзя отключить конфигурацией.

Мы также используем Spring Security, можно использовать оба в гармонии!

1 голос
/ 09 июля 2011

С Spring Security , вам просто нужно добавить:

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

И настройте его правильно:

  1. используйте JdbcDaoImpl в качестве UserDetailsService
  2. включить поддержку группы
  3. настроить запросы (если вы используете хранилище учетных данных базы данных)

Если вы не используете хранилище учетных данных базы данных, просто настройте предпочитаемый UserDetailsService, чтобы добавить учетные данные пользователя и группы к полномочиям сгенерированного UserDetails.

Конечно, это трудно понять, не проверив концепции в документации , но проверки доступа на уровне методов вполне возможны при использовании пружинной безопасности, и это моя предпочтительная технология.

1 голос
/ 08 июля 2011

Вы можете сделать это довольно тривиально самостоятельно, используя динамические прокси.

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()
         }
 }
0 голосов
/ 29 октября 2013

В Spring Security при состоянии документов на уровне метода могут использоваться как @Secured, так и @PreAuthorize.

Чтобы включить @PreAuthorize (если вы еще этого не сделали ...), вам нужно поставить <global-method-security pre-post-annotations="enabled" /> в вашей конфигурации XML;

Для @Secured используйте <global-method-security secured-annotations="enabled" />.

Подробнее см. В этой статье .

...