‏نمایش پست‌ها با برچسب elasticsearch. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب elasticsearch. نمایش همه پست‌ها

۱۳۹۷ اسفند ۴, شنبه

محدود کردن جستجوی الستیک روی داده های کاربر جاری در JHipster

وقتی یه پروژه رو با JHipster ایجاد میکنیم، یکی از بخش های مهم که برامون انجام نمیده محدود کردن نمایش داده های هر کاربر برای خود اون کاربر. به صورت پیشفرض وقتی کاربری درخواست نوع داده ای رو میکنه، تمام داده های موجود رو برای کاربر ارسال میکنه (که راه حل برطرف کردن این مشکل با یه سرچ کوچیک پیدا میکنید).
اما وقتی Elasticsearch رو به پروژه اضافه میکنیم و وظیفه جستجو رو به اون واگذار میکنیم، یه مشکل جدید هم ایجاد میشه، اینکه جستجوی کاربر روی تمام داده ای موجود همه کاربران اتفاق میافتد در صورتیکه هر کاربر فقط مجاز به جستجو و مشاهده داده های خودش، نه تمام داده های موجود! خب به صورت پیشفرض نحوه جستجو رو به اینصورت پیاده سازی کرده که تولید مشکل میکند:

return StreamSupport.stream(categorySearchRepository.search(queryStringQuery(query))
    .spliterator(), false).collect(Collectors.toList());

و ما باید یه کار کوچیک روش انجام بدیم و اون رو تبدیل کنیم به این کد:

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(queryStringQuery(query));
if (SecurityUtils.isAuthenticated() && !SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.ADMIN)) {
 queryBuilder = queryBuilder.filter(matchQuery("user.login", SecurityUtils.getCurrentUserLogin().orElse("")));
}
return StreamSupport.stream(categorySearchRepository.search(queryBuilder).spliterator(), false).collect(Collectors.toList());
تو کد بالا، چک میکنیم اگه کاربر، ادمین نبود (AuthoritiesConstants.ADMIN)، به quryBuilder یک فیلتر اضافه میکنیم که براساس کاربر جاری جستجو انجام بشه.
راه حل این مشکل تو اپلیکیشن نمونه 21-point روی گیت هاب وجود داره که منبع منم همون کد بود (PointsResource.java).