|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
Всем привет, у меня есть solution, которое состоит из 3 проектов 1)Models-dll- с моделями сущностей 2)Data-dll - вся тема с EntityFramework Core 3.0 3)Web- web api приложение. Есть сущность накладная- не суть важно какая она- есть номер, есть дата создания и тд. Модель накладной (Invoice) описывается в проекте Models В проекте Data я создаю таблицу с накладными Код: c# 1.
Разделение слоев логики я выдерживал нормально, пока мне не пришлось реализовать следующий функционал. Накладную могут печатать разные пользователи, и нужно отслеживать кто-какую накладную напечатал. Соответственно к сущности Invoice нужно добавлять свойство IdentityUser из пространства Microsoft.AspNetCore.Identity. И мой девственно чистый от зависимостей проект Models получает вливание Microsoft.AspNetCore пакета и все предыдущее разделение слоев окажется насмарку. Как можно обыграть ситуацию, чтобы не размазывать зависимости по всему решению? Единственный вариант, который приходит в голову, это хранить в свойствах Invoice не IdentityUser, а его Guid, но EF Core, по моему не позволяет использовать такую технику. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 18:05 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub, .. так а когда контроллер web-api вызывает сервис, он разве не может передать туда параметр ("Вася_Пупкин_первопечатник") .? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 18:14 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
хранить это в отдельной таблице, в которой будет информация какую накладную, какой пользователь, когда и т.д. распечатал ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2020, 19:06 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub И мой девственно чистый от зависимостей проект Models получает вливание Microsoft.AspNetCore пакета и все предыдущее разделение слоев окажется насмарку. Как можно обыграть ситуацию, чтобы не размазывать зависимости по всему решению? Пакет Microsoft.AspNet.Identity.Core не имеет никаких внешних зависимостей, чего вы там размазываете не пойму? Если используете Identity, модель должна знать об этих сущностях, почему вы пытаетесь их скрыть? Проблемы не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2020, 11:48 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub, Добавить сущность описывающую процесс распечатывания и записывать туда Ваш invoice и id пользователя. Можно даже добавить класс InvoiceAudit со ссылкой на Invoice, тип операции и пользователя, например в отдельную сборку Audit. В таком случае в Models нет необходимости ссылаться на сборку с Identity :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2020, 19:45 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub Соответственно к сущности Invoice нужно добавлять свойство IdentityUser из пространства Microsoft.AspNetCore.Identity. И мой девственно чистый от зависимостей проект Models получает вливание Microsoft.AspNetCore пакета и все предыдущее разделение слоев окажется насмарку. Как можно обыграть ситуацию, чтобы не размазывать зависимости по всему решению? Единственный вариант, который приходит в голову, это хранить в свойствах Invoice не IdentityUser, а его Guid, но EF Core, по моему не позволяет использовать такую технику. Спасибо это функционал логирования, не надо никаких ссылок ни в какие классы, нужно обычное логирование, показывающее кто, что и когда делал ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 00:11 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
stenford, Вы наверное имели в виду аудит. Логирование это для диагностики, в бизнес-логике лог не должен участвовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2020, 02:18 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
Как я делал бы без EF. Код: c# 1. 2. 3. 4. 5.
Как приходится писать с EF Core Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Сейчас проект с моделями выглядит так(см рис). Соответственно, после того, как я сконфигурирую модели с учетом правил EF Core- в зависимостям на рисунке добавится зависимость от Data проекта. Как должны идти зависимости Models->BL(Data)->Web После конфигурации моделей с учетом EF Core у меня получится Models<->BL(Data)->Web, то есть модель будет знать о бизнес логике, что мне и хотелось бы избежать. stenford,это нужно создать еще один проект, который будет получать ссылки из Models(оттуда возьмется сущность Invoice) и Data(оттуда возьмется IdentityUser), создать сущность логгирования/аудита и дополнительно запускать операцию логгирования после добавления новой сущности Invoice в базу? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2020, 09:53 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub stenford,это нужно создать еще один проект, который будет получать ссылки из Models(оттуда возьмется сущность Invoice) и Data(оттуда возьмется IdentityUser), создать сущность логгирования/аудита и дополнительно запускать операцию логгирования после добавления новой сущности Invoice в базу? конкретная реализация логирования/аудита зависит от проекта, требований, хостинга и прочих вещей. В системе, имеющей требования к безопасности, логируются все действия пользователей, что-бы можно было воссоздать кто, что и когда делал. В случае WebAPI к примеру можно логировать все вызовы эндпоинтов с указанием юзера, времени, айпишника, параметров итд, дальше есть тулзы для анализа этих логов. Если под "распечаткой" инвойса подразумевается вызов эндпоинта WebAPI то это уже было-бы достаточно для реализации данного требования. Если таких требований нет, а все что нужно - это администратору по клику одной кнопки выдать кто и когда распечатал какие инвойсы - то можно прикрутить свой аудит, только зачем новый проект-то? Создаешь таблицу аудита и сохраняешь в нее когда инвойс "распечатывается" из контроллера, сервиса или как там у тебя солюшн собран ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2020, 03:33 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub Как я делал бы без EF. Код: c# 1. 2. 3. 4. 5.
Расскажите пожалуйста, что вас так приводит в ужас от мысли тащить Microsoft.AspNetCore.Identity? У него зависимостей нет. Вы его используете в модели данных. В чём проблема? Начитаются каких-то статей от душевно больных людей, потом начитают бороться, то с IQueryable, то с зависимостями, которые как раз нужны. Не тем занимаетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2020, 12:43 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
Если не зашкварно так делать, то ладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2020, 08:30 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
vb_sub Если не зашкварно так делать, то ладно. все ты правильно писал - не надо тащить Identity в бизнес слой, ему там совершенно не место и при переходе на новую версию тебе придется редеплоить сборки с бизнес слоем, за такие вещи даже джуниоры по ушам получают на код ревью ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 00:36 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
stenford vb_sub Если не зашкварно так делать, то ладно. все ты правильно писал - не надо тащить Identity в бизнес слой, ему там совершенно не место и при переходе на новую версию тебе придется редеплоить сборки с бизнес слоем, за такие вещи даже джуниоры по ушам получают на код ревью Фигню говорите, уж простите. Если у человека Identity напрямую используется в модели, значит его нужно подключить и использовать. Иначе, по вашей аналогии, все все библиотеки из нугета надо скрыть за своими абстракциями, все. Ни одного проекта не видел, и не слышал от коллег с большим опытом, чтобы подобное сокрытие существенно помогло при "переходе на новую версию". Глупости. Получить за подобное "по ушам" можно лишь от джуниора, но никак не от сеньора. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 00:58 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
Забавно, что я раньше был в таких проектах, которые ведущие разработчики вели по пути борьбы с зависимостями и втыкали абстракции куда попало. Никаких зависимостей ни от чего. В итоге проект скатывался в говно, тормозил и бажил нещадно, абстракции протекали, а джуны только и делали, что затыкали дыры. Какой там переход "на новую версию"? Что за задача такая первостепенная, обязательно обеспечить переход на "новую версию", переход на другую базу, на другой ОРМ, на другую платформу, на другой язык. Откуда эти чудовищные идеи вообще приходят? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 01:04 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
hVostt Фигню говорите, уж простите. Если у человека Identity напрямую используется в модели, значит его нужно подключить и использовать. Иначе, по вашей аналогии, все все библиотеки из нугета надо скрыть за своими абстракциями, все. IdentityUser к бизнес логике не имеет никакого отношения, это идентификация и авторизация юзера вызывающего эндпоинт, а вопрос заданный топикстартером - это классическое логирование/аудит и решается как я уже написал сверху, сборка с доменными классами тут вообще не затрагивается, и уже тем более в нее не пихаются зависимости принадлежащие авторизационному слою web api. За класс инвойса, содержащий клеймы пользователей можно далеко не только по ушам получить hVostt Какой там переход "на новую версию"? Что за задача такая первостепенная, обязательно обеспечить переход на "новую версию", переход на другую базу, на другой ОРМ, на другую платформу, на другой язык. Откуда эти чудовищные идеи вообще приходят? что за очередной поток сознания? Какой ОРМ? До тебя не доходит, что обновив авторизационные зависимости слоя api ты вынужден ребилдить бизнес слой? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 02:56 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
stenford IdentityUser к бизнес логике не имеет никакого отношения, это идентификация и авторизация юзера вызывающего эндпоинт, а вопрос заданный топикстартером - это классическое логирование/аудит и решается как я уже написал сверху, сборка с доменными классами тут вообще не затрагивается, и уже тем более в нее не пихаются зависимости принадлежащие авторизационному слою web api. За класс инвойса, содержащий клеймы пользователей можно далеко не только по ушам получить Вы не правы. Identity это конкретная реализация авторизации. Это именно реализованная бизнес-логика с конкретной моделью данных и настраиваемыми процедурами. Если вы взяли Identity, а не пилите свою авторизацию, то используйте Identity. Не надо фантазировать тут про инвойсы. Наличие Identity никак не влияет на любую другую логику. stenford что за очередной поток сознания? Какой ОРМ? До тебя не доходит, что обновив авторизационные зависимости слоя api ты вынужден ребилдить бизнес слой? Если вы хотите правильно абстрагироваться от слоя авторизации, значит вы должны вынести её в другую БД и другой сервис. Это называется SSO. Почитайте на досуге. А если уж вы авторизацию встроили в своё приложение и используете Identity, то никакого смысла абстрагироваться от него нет. Это натуральная дурость. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 13:46 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
Вот готовая реализация внешнего сервера авторизации https://identityserver.io/ При использовании этого сервиса вам не требуется тащить никакое Identity в своё приложение и свою модель данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 13:50 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
hVostt Вы не правы. Identity это конкретная реализация авторизации. Это именно реализованная бизнес-логика с конкретной моделью данных и настраиваемыми процедурами. Если вы взяли Identity, а не пилите свою авторизацию, то используйте Identity. это конкретная реализация авторизации , а не бизнес логики, IdentityUser - это авторизация "из коробки" от майкрософт основанная на куках, запихнув детали этой реализации в бизнес логику ты намертво привязываешь систему к этой конкретной реализации, и как только этот механизм потребуется сменить к примеру на токены (на чем собственно сейчас работают большинство систем ) - внезапно вся бизнес логика отправляется на переделку, последующее тестирование и редеплоймент hVostt Не надо фантазировать тут про инвойсы. Наличие Identity никак не влияет на любую другую логику. Вот к чему приводит твое полное непонимание ООП - клеймы пользователей в инвойсе это нарушение первой-же буквы в слове solid, тут даже уже не джуны, а студенты-практиканты таких ошибок не допускают hVostt Если вы хотите правильно абстрагироваться от слоя авторизации, значит вы должны вынести её в другую БД и другой сервис. Это называется SSO. Почитайте на досуге. А если уж вы авторизацию встроили в своё приложение и используете Identity, то никакого смысла абстрагироваться от него нет. Вот готовая реализация внешнего сервера авторизации https://identityserver.io/ очередная каша из терминов и подходов, которые ты не понимаешь и даже не пытаешся разобраться. Для начала, что-бы уйти от майкрософтовского Identity не обязательно использовать внешний сервер авторизации - ничто не мешает генерировать токены в своем собственно сервисе. Более того, ничто не мешает написать свой собственный велосипед на куках (без Identity), все это - детали реализации авторизационного слоя никак не связанные с работой остальной системы. Можно использовать куки, можно токены собственного производства, или сгенерированные identityserver, или от OAuth, Okta, Azure B2B или многих других - все это инкапсулировано в авторизационном слое и не имеет никакого отношения к остальной системе. А SSO это вообще из другой оперы - эта технология позволяет получать токены без ввода пароля на сервере авторизации, просто на основе наличия авторизации от другой системы, к примеру залогинившись в gmail ты получаешь доступ к youtube т.к. последний автоматически выдаст тебе токен на основе авторизационной куки (полученной в ходе авторизации на gmail), с "абстракцией от слоя авторизации" это никак не связано, как и с обсуждаемой тут проблемой ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2020, 03:07 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
stenford это конкретная реализация авторизации , а не бизнес логики, IdentityUser - это авторизация "из коробки" от майкрософт основанная на куках, запихнув детали этой реализации в бизнес логику ты намертво привязываешь систему к этой конкретной реализации, и как только этот механизм потребуется сменить к примеру на токены (на чем собственно сейчас работают большинство систем ) - внезапно вся бизнес логика отправляется на переделку, последующее тестирование и редеплоймент С какой это кстати Identity привязана к кукам? Чего вы вообще тут городите. Перестаньте позориться. https://docs.microsoft.com/ru-ru/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-3.1 stenford Вот к чему приводит твое полное непонимание ООП - клеймы пользователей в инвойсе это нарушение первой-же буквы в слове solid, тут даже уже не джуны, а студенты-практиканты таких ошибок не допускают Из разряда "сам пошутил -- сам посмеялся". Вы там напились что-ли? stenford очередная каша из терминов и подходов, которые ты не понимаешь и даже не пытаешся разобраться. Для начала, что-бы уйти от майкрософтовского Identity не обязательно использовать внешний сервер авторизации - ничто не мешает генерировать токены в своем собственно сервисе. Более того, ничто не мешает написать свой собственный велосипед на куках (без Identity), все это - детали реализации авторизационного слоя никак не связанные с работой остальной системы. Можно использовать куки, можно токены собственного производства, или сгенерированные identityserver, или от OAuth, Okta, Azure B2B или многих других - все это инкапсулировано в авторизационном слое и не имеет никакого отношения к остальной системе. А SSO это вообще из другой оперы - эта технология позволяет получать токены без ввода пароля на сервере авторизации, просто на основе наличия авторизации от другой системы, к примеру залогинившись в gmail ты получаешь доступ к youtube т.к. последний автоматически выдаст тебе токен на основе авторизационной куки (полученной в ходе авторизации на gmail), с "абстракцией от слоя авторизации" это никак не связано, как и с обсуждаемой тут проблемой Как только вы предоставите пример, показывающий проблему при апгрейде версии Identity, будем предметно разговаривать. Ваши потуги в виде "полное непонимание ООП" и "очередная каша" выглядят как попытка придать значимость вашим словам, но подобное может сработать только в детском садике. Потрудитесь привести адекватные аргументы. Пока что не вводите людей в заблуждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2020, 18:12 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
hVostt Как только вы предоставите пример, показывающий проблему при апгрейде версии Identity, будем предметно разговаривать. с тобой не имеет смысла предметно разговаривать из-за незнания тобой ООП, SOLID, и вытекающего из этого непонимания базовых принципов разработки. Если ты не понимаешь, что слой авторизации должен иметь возможность быть заменен (или обновлен) не снося при этом бизнес логику - то повторять на 10-й раз почему я не собираюсь ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 02:48 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
С тобой не имеет смысла предметно разговаривать, пока не разберешься, что модель юзера (фактически POCO-классы) (плюс модели ролей и т.п.) для DAL не имеют никакого прямого отношения к авторизации. Уже сама невероятная глупость stenford IdentityUser - это авторизация "из коробки" от майкрософт основанная на куках ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 12:38 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
stenford с тобой не имеет смысла предметно разговаривать из-за незнания тобой ООП, SOLID, и вытекающего из этого непонимания базовых принципов разработки. Если ты не понимаешь, что слой авторизации должен иметь возможность быть заменен (или обновлен) не снося при этом бизнес логику - то повторять на 10-й раз почему я не собираюсь Да, я об этом и прошу. Не нужно писать глупости, и тем более повторять их 10 раз. Хотелось бы конечно узнать у вас конкретные проблемы, которые видите в этом. Ведь вы гуру ООП и SOLID. Но не судьба. Вы их нам не покажете. Это видимо секрет уровня НАТО. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 16:30 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
Глянул, что же так сильно задело нашего мега-гуру ООП и SOLID-a stenford Вот полный расклад, для тех, кому интересно. пакет Microsoft.AspNetCore.Identity действительно имеет зависимость от Microsoft.AspNetCore.Authentication.Cookies -- ну точно, это же явно говорит о том, что Identity "построена на куках" для слоя доступа к данным DAL можно (и нужно) сослаться на пакет Microsoft.Extensions.Identity.Stores -- если Identity реально используется в проекте конечно. Никаких левых зависимостей больше нет, ни на злосчастные куки, ни привязки к Asp.Net. мы получим ровно то, что нужно в DAL для авторизации: POCO и интерфейсы. это итак абстракции, делать абстракции над абстракциями не нужно, это бесполезная трата времени и сил. если в проекте используется Entity Framework, то понятное дело, нужно 1. сослаться на пакет Microsoft.AspNetCore.Identity.EntityFrameworkCore 2. DbContext приложения должен наследоваться от IdentityDbContext ну и обращаясь к начинающим и продолжающим. в жизни вы увидите много треша, обмазанные в 10 слоёв абстракциями проекты от "мега-гуру ООП и SOLID". относитесь к этому скептически. каждое действие или решение должно иметь явный смысл и понятную пользу. руководствуясь причинами "если бы, да кабы" вместо быстрых и эффективных решений, вы только мозги себе засрёте и не продвинетесь хоть сколько-нибудь далеко. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 17:07 |
|
Хранение метки пользователя, совершившего операцию
|
|||
---|---|---|---|
#18+
hVostt если в проекте используется Entity Framework, то понятное дело, нужно 1. сослаться на пакет Microsoft.AspNetCore.Identity.EntityFrameworkCore 2. DbContext приложения должен наследоваться от IdentityDbContext опять таки, не обязательно. но сильно сэкономит время. и не нужно бояться каких-то страшных изменений, которые вам всё поломают и всё "придётся переделывать". это продукт больных фантазий. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2020, 17:08 |
|
|
start [/forum/topic.php?fid=17&fpage=2&tid=1349087]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 234ms |
total: | 369ms |
0 / 0 |