
Like
22.03.2018
23:24:32
rand_cache_plugin_next({CacheBits, CacheSize, <<>>}) ->
Классика

Anton
22.03.2018
23:26:33
Ну такое. В доку конечно надо смотреть часто... все таки другая школа. Перестроится очень сложно. Но безумно интересно. Целый новый мир...

Roman
23.03.2018
08:01:04
@zloyuser Ты вчера обмолвился о том, что надо разделять пользователя и аккаунт. Что есть что и как их лучше делить на твой взгляд?

Google

Anton
23.03.2018
08:04:26
Это Domain Specific вопрос. Надо смотреть в каждом конкретном случае. Если приводить некие общие правила то User это только login, pass и правила авторизации. Аккаунт знает только идентификатор пользователя (и то не всегда это нужно) и содержит уже необходимые бизнес правила.

Roman
23.03.2018
08:07:33


Anton
23.03.2018
08:10:08
То что ты описал это как раз пользователь в моем понимании. Аутентификация + Авторизация. А аккаунт это скажем биллинговая информация.

Roman
23.03.2018
08:10:28
Ну и опять же - блокировка юзера - это вызов API, который предоставляет не сервис аутентификации (он вообще никакой API не отдаёт кроме того, что необходим для работы OIDC). То бишь это вызывается API Endpoint в другом процессе.
А юзер, со всеми его токенами живёт на сервисе аутентификации. У которого публичный API только на интероп с внешним миром.

Anton
23.03.2018
08:14:23
Ну вот аккаунт знает про баланс, следит за его списанием и при окончанием средст идет в User API и блочит пользователя.

Sergey
23.03.2018
08:14:44
по всякому можно сделать

Anton
23.03.2018
08:15:00
Но суть не меняется.

Roman
23.03.2018
08:15:19

Sergey
23.03.2018
08:15:35

Roman
23.03.2018
08:16:13

Google

Sergey
23.03.2018
08:16:28

Roman
23.03.2018
08:16:36
Он защищает другие сервисы. Но сам по себе является Entry-Point'ом.
Незащищённым.

Sergey
23.03.2018
08:16:44
если это так - у тебя должен быть еще и третий сервис который будет шарить данные с сервером авторизации что не гуд

Roman
23.03.2018
08:17:03

Sergey
23.03.2018
08:17:06

Roman
23.03.2018
08:17:18
Отдельные приложения, в отдельных процессах

Sergey
23.03.2018
08:18:03
в том то и прикол что нет)

Anton
23.03.2018
08:18:05
Тут два сервиса Credentials и User делящих общие данные.

Sergey
23.03.2018
08:18:22
твой oauth сервер может быть частью микросервиса работающего с кредами юзеров
но сам по себе oauth сервер не является микросервисом как таковым так как это просто инфраструктура

Anton
23.03.2018
08:18:48
Их можно реализовать как в одном приложении так и в нескольких, но данные придется шарить

Sergey
23.03.2018
08:18:56
да и вообще - авторизация это инфраструктура
как и поиск
и можно вообще не рассматривать это как микросервис.... а скорее просто как некие штуки которые обслуживают твои микросервисы.

Roman
23.03.2018
08:19:29

Sergey
23.03.2018
08:20:16

Roman
23.03.2018
08:20:25
Ну тобишь бизнес-ивент "закончились деньги на счету" => инфраструктурный ивент "заблочить юзера и отозвать все токены"

Google

Sergey
23.03.2018
08:20:34

Roman
23.03.2018
08:22:09
Ну то бишь это 3 микросервиса вырисовывается.
Первый - oidc,
второй - внутренний, который менеджит юзеров полностью (находится в защищённом контуре и не торчит наружу от слова совсем)
третий - публичный api, для менеджмента юзеров, защищённый токенами.

Sergey
23.03.2018
08:22:42

Roman
23.03.2018
08:23:02
Третий то вообще Gateway по сути.

Sergey
23.03.2018
08:23:31

Борис
23.03.2018
08:25:18
Гайс, как быть с DDD и вспомогательными, не бизнесс сервисами, например логированием. Вопрос сугубо технический (дайте код, или прям как вы решаете эту проблему)
Например, у меня есть бизнесс модель Restaurant, Dish, Ingredient. Я создаю конкретный ресторан, с его конфигурацией, а потом прошу его приготовить конкретное блюдо. Где тут кошерно всунуть логгер.
$restaurant = new Restaurant(array $dishes, array $ingredients);
$restaurant->cook(Dish $dish);

Arseniy
23.03.2018
08:25:26
Подскажите, это патерн какой-то?

Anton
23.03.2018
08:25:45
Гайс, как быть с DDD и вспомогательными, не бизнесс сервисами, например логированием. Вопрос сугубо технический (дайте код, или прям как вы решаете эту проблему)
Например, у меня есть бизнесс модель Restaurant, Dish, Ingredient. Я создаю конкретный ресторан, с его конфигурацией, а потом прошу его приготовить конкретное блюдо. Где тут кошерно всунуть логгер.
$restaurant = new Restaurant(array $dishes, array $ingredients);
$restaurant->cook(Dish $dish);
AOP?

Like
23.03.2018
08:26:18
Это пиздец

Sergey
23.03.2018
08:26:20

Arseniy
23.03.2018
08:26:26
Дефолтная конфигурация Spring Security из гайда

Sergey
23.03.2018
08:27:16
Гайс, как быть с DDD и вспомогательными, не бизнесс сервисами, например логированием. Вопрос сугубо технический (дайте код, или прям как вы решаете эту проблему)
Например, у меня есть бизнесс модель Restaurant, Dish, Ingredient. Я создаю конкретный ресторан, с его конфигурацией, а потом прошу его приготовить конкретное блюдо. Где тут кошерно всунуть логгер.
$restaurant = new Restaurant(array $dishes, array $ingredients);
$restaurant->cook(Dish $dish);
а как это так что ты готовое блюдо передаешь на готовку?)


Roman
23.03.2018
08:27:38
еще раз - у тебя есть 2 сервиса, они работают с одними и теми же данными?
Не. 3 микросервиса.
1) Oidc сервер. Имеет 1 локальную базку с выданными токенами и своими внутренними настройками (клиенты, клэймсы, скоупы - вот это всё). При аутентификации юзера он ходит к микросервису юзеров и запрашивает у него инфу. Подписан на ивенты от микросериса юзеров через Rabbit.
2) Микросервис юзеров. Имеет 1 локальную базку с юзерами, их ролями, состоянием юзера и т.д. При блокировке юзеров - пуляет ивент в рэбит, чтобы oidc сервис потёр токены.
3) Публичный API, защищённый токенами для управления юзерами. Локальной базки не имеет. Обращается к oidc для валидации токенов, выполняет авторизацию запроса и, если всё ок - дёргает микросервис юзеров (по сути является шлюзом для него).

Sergey
23.03.2018
08:27:42
ну и важный момент - что именно тебе надо логировать.... а так - AOP тут хорошо ложится (или прокси классы)

Борис
23.03.2018
08:29:52
Серега, это псевдокод. Там чуть подробнее нету смысла расписывать. Передаю на готовку я не готовое блюдо )))
Хочу логировать все внутри (дебаг: было столько ингредиентов, дебаг: осталось столько, еррор: хуясеты захотел, у тебя не хватает на складе итд)
Поэтому прокси не прокатят.
Да и, честно говоря, про AOP слышу в первые, с википедии не сильно понял что это. МОжно примерчик чуть пошире? Я так понял это просто пачка прокси-адаптеров?

Sergey
23.03.2018
08:31:28
а как блочить когда кто-то не заплатил?

Google

Sergey
23.03.2018
08:33:17

Roman
23.03.2018
08:33:27

Борис
23.03.2018
08:34:45

Anton
23.03.2018
08:36:18

Борис
23.03.2018
08:36:52
Как именно? Через статический фасад, или прокидывая технические сервисы по вызовам?

Dmitriy
23.03.2018
08:41:27
а если евенты кидать?
а уже логер подписывается на них и логирует чо надо

Anton
23.03.2018
08:43:14

Sergey
23.03.2018
08:43:31

Anton
23.03.2018
08:43:39

Sergey
23.03.2018
08:43:53

Anton
23.03.2018
08:43:59

Борис
23.03.2018
08:51:42
это сервис локатор между прочим
Это точно дерьмо, и точно не сервис локатор :) Монолог называет это registry
Но так как это не бизнесс сервис или бизнесс объект то в принципе, норм. Главное сделать метод статическим, но чтобы в тестах им можно было пользоваться.

Sergey
23.03.2018
08:52:29

Артур Евгеньевич
23.03.2018
09:46:36

Roman
23.03.2018
10:16:59
Кстати такой вопрос. Геттеры сеттеры. А если у меня геттеры публичные и только возвращают значение (т.е. только для чтения состояния), а сеттеры - приватные и вызываются только чтобы записать значение внутри методов доменных объхектов - такой подход - норм?
Язык C# если что.
Ну то бишь я могу у User'а получить Name, а вот изменить его - только через вызов user.ChangeName(newName);
При этом вызов геттера никогда никак не мутирует состояние.
@fes0r что скажешь на этот счёт?

Google

Aleh
23.03.2018
10:19:06

Sergey
23.03.2018
10:19:29
1. тогда зачем сеттеры
2. зависит от того как геттеры используются. Если результат фигурирует в условиях/логике - то что-то тут не так

Артур Евгеньевич
23.03.2018
10:19:31
как я понимаю

Sergey
23.03.2018
10:20:03

Aleh
23.03.2018
10:20:06

Roman
23.03.2018
10:20:25

pew
23.03.2018
10:20:41

Sergey
23.03.2018
10:20:44

Roman
23.03.2018
10:21:12
в шарпах же есть рефлексия
Есть, но ORM работает либо в связке геттер-сеттер (даже если приватный, главное чтобы он был), либо в связке геттер=>_приватное поле

pew
23.03.2018
10:21:13
и иногда что бы кешировать при первом обращении результат, или при изменении состояния при первом обращении перекешировать

Артур Евгеньевич
23.03.2018
10:21:15
Да, сеттеры не нужны)
Помню вообще ахирел когда оттебя это првый раз услышал) А потом ты еще скзаал что гетеры тоже нежелательны, я подумал ты вообще кукухой поехал) А щас вот проникся))

Sergey
23.03.2018
10:21:20

pew
23.03.2018
10:21:51

Aleh
23.03.2018
10:22:15

Sergey
23.03.2018
10:22:25

pew
23.03.2018
10:22:25
время на серваке я буду перемещать туда куда надо
или еще что-нибудь такое

Sergey
23.03.2018
10:23:11

pew
23.03.2018
10:23:16
ну да