Spring Security PermissionEvaluator: как реализовать метод hasPermission с идентификатором объекта? - PullRequest
0 голосов
/ 20 апреля 2020

Spring's Security Метод hasPermission имеет реализацию, которая (как я понял) предназначена для передачи имени класса ( targetType ) и идентификатора объекта ( Serializable * 1006). *).

Не могли бы вы объяснить (хотя бы в целом) , как правильно реализовать эту реализацию ? Я искал пример передачи идентификатора объекта и не нашел ничего (даже в Spring do c).

В моей ситуации я хочу проверить разрешение пользователя DELETE на некоторые из моих классов (например, «Цель»). Все эти классы имеют универсальные методы и поля, поэтому у меня может быть универсальный лог c для проверки разрешения внутри PermissionEvaluator.

. Для этого я собираюсь передать идентификатор объекта и имя класса объекта. в PermissionEvaluator и выполните проверку здесь следующим образом:

@PreAuthorize("hasPermission(#id, 'Goal','DELETE')")

Звучит неплохо, пока не доходит до реализации, потому что я не совсем понимаю, как я могу получить экземпляр Object по имени класса и идентификатору внутри Оценщик разрешений.

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator 

 @Override
    public boolean hasPermission(Authentication authentication, Serializable serializable, String targetType,
                                 Object permission) {

Да, я могу создать экземпляр объекта Class.forName(targetType), но как я могу получить его экземпляр Id (serializable) из соответствующего репозитория? (У меня разные хранилища для каждого объекта). @Autowiring все мои 30 хранилищ будут безумием.

1 Ответ

0 голосов
/ 21 апреля 2020

Реализован мой сервис, который принимает идентификатор объекта и тип объекта, а затем отправляет обратно объект, который позже можно распаковать. Я использовал Dynami c HQL, поэтому нет необходимости в автопроводке 30+ JPA репозиториев (плохо, я упустил эту возможность в начале).


    @PersistenceContext
    EntityManager entityManager;

    static String entityClassPath="com.platform.entity.";

    public Object getEntity(String className, Long id) {

        String classToQuery = capitalize(className);

        /* Check if Entity class exists to decide whether to query DB or not */
        try {
            Class cls = Class.forName(entityClassPath + className);
        } catch (Exception e) {
            return null;
        }

        /* Query DB if Entity class exist */
        Query query;
        try {
            query = entityManager.createQuery("SELECT Q FROM " + classToQuery + " Q WHERE Q.id=?1");
            query.setParameter(1, id);
            return query.getSingleResult();
        } catch (Exception e) {
                e.printStackTrace();
                return null;
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...