У меня есть 2 источника данных в моем приложении Spring Boot. Всякий раз, когда я беру соединение, и в контексте безопасности есть субъект пользователя, я хотел бы установить идентификатор пользователя в контексте пакета базы данных, вызвав процедуру.
Чтобы достичь этого, я создал совет AOP, подобный этому:
@Configuration
@Aspect
class SqlAuthAopConfig {
@AfterReturning(
value = "bean(myDataSource) && execution(java.sql.Connection javax.sql.DataSource+.getConnection(..))",
returning = "connection")
fun initUser(connection: Connection) {
val principal = SecurityContextHolder.getContext().authentication.principal as? MyUser ?: return
connection.prepareStatement("BEGIN P_AUTH.SET_ID(?);END;").use { ps ->
ps.setLong(1, principal.id)
ps.execute()
}
}
}
Как вы можете видеть, я использовал beans
указатель pointcut (потому что у меня есть 2 источника данных). Это не похоже на типобезопасность. Если имя bean-компонента DS изменится в будущем, выражение pointcut не будет соответствовать ни одному bean-компоненту, но приложение будет запущено без вывода сообщений. Как я могу настроить этот аспект, чтобы не запускать приложение, если выражение pointcut не совпадало?