Авторизация - это не то же самое, что аутентификация. Аутентификация - это то, может ли пользователь успешно войти в систему или нет. Авторизация связана с тем, имеет ли пользователь, вошедший в систему, достаточно прав для выполнения метода. Таким образом, даже если пользователь успешно вошел в систему (т.е. происходит AuthenticationSuccessEvent
), если у него недостаточно прав для выполнения метода, метод все равно не выполняется.
Что вам действительно нужно, так это обнаружить авторизацию событие успеха, но теперь вы обнаруживаете событие успешной аутентификации, что совершенно разные вещи.
Чтобы включить spring -security для публикации sh события успешной авторизации после пользователя, который достаточно разрешений для успешного выполнения защищенного метода, вы должны включить setPublishAuthorizationSuccess
из MethodInterceptor
.
Из docs , чтобы переопределить настройки по умолчанию, связанные с безопасностью метода, вы можете расширить GlobalMethodSecurityConfiguration
:
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
public MethodInterceptor methodSecurityInterceptor(MethodSecurityMetadataSource methodSecurityMetadataSource) {
MethodInterceptor result = super.methodSecurityInterceptor(methodSecurityMetadataSource);
((MethodSecurityInterceptor) result).setPublishAuthorizationSuccess(true);
return result;
}
}
И AuthorizedEvent
будет опубликован после того, как у пользователя будет достаточно разрешений для выполнения защищенного метода. Поэтому создайте ApplicationListener
для прослушивания и обработки:
@Component
public class MyEventListener implements ApplicationListener<AuthorizedEvent> {
@Override
public void onApplicationEvent(AuthorizedEvent event) {
//Handle the AuthorizedEvent event here......
}
}