Орден Spring @ Transactional и Spring Security @PreAuthorize - PullRequest
13 голосов
/ 14 января 2012

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

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 проверить авторизацию, а затем создать транзакцию, если пользователь авторизован?

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

1 Ответ

16 голосов
/ 14 января 2012

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

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

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

См. Также

...