Просто включите кеширование: @EnableCaching
и поместите @Cacheable("checkauth")
поверх метода checkAuthorization
.
Правка Я понял, что мой ответ не для запроса, так какКомментарий ниже заявлен.Определенно есть несколько причудливых способов сделать это, например, здесь: Кэширование по запросу с помощью Spring , который использует AOP
.
Но так сложно!Просто представьте себе, что большинство запросов занимают меньше секунды для большинства современных веб-приложений, политика удержания которых @Cached(expire = 1, timeUnit = TimeUnit.MINUTES)
сделает свое дело, предварительная оптимизация - это дьявол.
Но я считаю, что этот подход действительно нестандарт для такой стандартной проблемы.Вместо этого я предлагаю вам роли: FOO
& BAR
, которые позволят вам просто аннотировать ваши методы с помощью: hasRole('FOO')
, hasRole('BAR')
.
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) {
User user = userRepository.findByUsername(username);
if (checkAuthorizationFoo(user)) user.addRole("FOO");
if (checkAuthorizationBar(user)) user.addRole("BAR");
return new user;
}
}
@PreAuthorize("hasRole('FOO')")
public String foo(String argument) {
@PreAuthorize("hasRole('BAR')")
public String bar(String argument) {
Поймите, что это не такt lazy, и ваши checkAuthorization
методы всегда вызываются, что является недостатком этого подхода.Вы могли бы сделать это лениво с небольшим количеством работы, вероятно, но снова просто будьте осторожны, сколько оптимизации вы выходите и делаете.