Подтвердить что ты не робот

Заказ Spring @Transactional и Spring Безопасность @PreAuthorize

Итак, у меня есть что-то вроде следующего:

public interface  MyService {

    @PreAuthorize("hasPermission(T(Name).OBJ, T(Action).GET)")
    MyObj getObj(String id);
}

@Service
public class MyServiceImpl implements MyService {

    @Override
    @Transactional
    public MyObj getObj(String id){

        return dao.get(id);
    }
}

@Controller
public class MyController {

    @Resource(name="myServiceImpl")
    private MyService service;

    public MyObj getObj(String id){

       return service.getObj(id);
    }
}

Когда вызывается метод getObj(id), все сначала завершается транзакцией, затем проверяется авторизация. Возможно ли сохранить эту конфигурацию и сначала получить Spring для проверки авторизации, а затем создать транзакцию, если пользователь авторизован?

Я потратил немало усилий на поиск ответа и ничего не нашел.

4b9b3361

Ответ 1

Вы можете использовать атрибут order при настройке @Transactional:

<tx:annotation-driven order="100"/>

Экспериментируйте с более низкими значениями, чтобы перенести аспект транзакции после авторизации. Похоже, <security:global-method-security/> также имеет эту настройку. Аспект безопасности должен сначала иметь более высокое значение (более низкий приоритет).

См. также