@oop_ru

Страница 571 из 785
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
Это Domain Specific вопрос. Надо смотреть в каждом конкретном случае. Если приводить некие общие правила то User это только login, pass и правила авторизации. Аккаунт знает только идентификатор пользователя (и то не всегда это нужно) и содержит уже необходимые бизнес правила.
Ну вот есть у меня статические "Фичи", которые объединяются в динамически создаваемые "Роли" (1 роль - много фич). Список всех фич - есть доступный пользователю функционал. С одной стороны - это аккаунт, так как содержит что-то помимо логина и пароля. С другой стороны - эта инфа должна попасть в токен, чтобы на основе неё как-то строить интерфейс. Так же, допустим, есть флаг IsLocked у пользователя. Это к нему напрямую должно относиться или к аккаунту? И тут тоже двоякая фигня. Потому что при блокировке пользователя - надо ревоукнуть все его токены, чтобы запретить ему доступ моментально.

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
модуль пэйментов кидает сообщение что "этот чел не заплатил", которое превращается в команду для сервера авторизации о том что "заблочить его!"
Тогда этот сервер должен предоставлять публичный API, который за пределами его зоны ответственности. Нехорошо получается(

Roman
23.03.2018
08:16:13
почему оно за пределами его зоны ответстветнности?
Потому что всё что он должен делать - это давать API, который описан в спеках OAuth 2.0 и OpenID Connect, и больше ничего.

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

Незащищённым.

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

Sergey
23.03.2018
08:17:06
Он защищает другие сервисы. Но сам по себе является Entry-Point'ом.
давай не будем путать микросервисы и просто сервисы

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
твой oauth сервер может быть частью микросервиса работающего с кредами юзеров
Ну я хочу чтобы API работы с кредами юзеров было защищено. А защищает его oidc микросервис. То есть если он начинает предоставлять такой API, то он получается сам валидирует выданные им самим же токены. Что по мне - бред)

Sergey
23.03.2018
08:20:16
Ну я хочу чтобы API работы с кредами юзеров было защищено. А защищает его oidc микросервис. То есть если он начинает предоставлять такой API, то он получается сам валидирует выданные им самим же токены. Что по мне - бред)
расскажи про поиск в контексте микросервисов - ты будешь делать отдельный микросервис ответственный за поиск или эта инфраструктура будет "размазана" по нескольким микросервисам?

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

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

Roman
23.03.2018
08:23:02
то есть у тебя есть 2 микросервиса которые делят данные между собой?
Ну один предоставляет, два других потребляют.

Третий то вообще Gateway по сути.

Sergey
23.03.2018
08:23:31
Ну один предоставляет, два других потребляют.
еще раз - у тебя есть 2 сервиса, они работают с одними и теми же данными?

Борис
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


Подскажите, это патерн какой-то?

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

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

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
Roman
23.03.2018
08:33:27
а как блочить когда кто-то не заплатил?
Ну крутится таска на биллинге, и если кто-то не заплатил - она дергает микросервис юзеров, блокируя засранца, ну и дальше по цепочке.

Борис
23.03.2018
08:34:45
ну передавай логгер че))) либо у тебя должно быть что-то изолированное что распоряжается ингридиентами. Типа попросил ты "10 шампиньенов" и оно в лог написало что "у меня забрали" или "мне поступило"
Ну хз, ну ты прикинь, у меня целый граф доменных объектов, я буду логгер пробрасывать везде?.... не, не оч. Лучше я заюзаю уже какой статический фасад для логгера, хер с ним, с солидом :)

Борис
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
Logger log = LogManager.getLogger(“name”); Статика как она есть.
это сервис локатор между прочим

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 Но так как это не бизнесс сервис или бизнесс объект то в принципе, норм. Главное сделать метод статическим, но чтобы в тестах им можно было пользоваться.

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


Roman
23.03.2018
10:16:59
Кстати такой вопрос. Геттеры сеттеры. А если у меня геттеры публичные и только возвращают значение (т.е. только для чтения состояния), а сеттеры - приватные и вызываются только чтобы записать значение внутри методов доменных объхектов - такой подход - норм?

Язык C# если что.

Ну то бишь я могу у User'а получить Name, а вот изменить его - только через вызов user.ChangeName(newName);

При этом вызов геттера никогда никак не мутирует состояние.

@fes0r что скажешь на этот счёт?

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

Артур Евгеньевич
23.03.2018
10:19:31
При этом вызов геттера никогда никак не мутирует состояние.
да он и не может по определению мутировать)

как я понимаю

Sergey
23.03.2018
10:20:03
да он и не может по определению мутировать)
там выше обсуждали квантовое ООП когда наблюдатель влияет на результат

Roman
23.03.2018
10:20:25
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
затем что бы полем не делать публичным
если тебе эти данные нужны для какой-то операции - надо переместить операцию туда где есть поле а не доступ давать

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

или еще что-нибудь такое

pew
23.03.2018
10:23:16
ну да

Страница 571 из 785