
val
04.10.2017
08:57:15
пользователь знает, что ему дали "решатель", который решает как то, который можно отменить и узнать о его здоровье

Sergey
04.10.2017
08:57:32
для объектов слишком маленький масштаб. Нужен контекст задачи

Aleh
04.10.2017
08:57:56
Ну да, это стратегии, которые лучше всего выражаются функциями

Google

Sergey
04.10.2017
08:58:18
ClassLoader назови мне по-другому

Sergey
04.10.2017
08:58:48

Sergey
04.10.2017
08:59:12
а что с ним не так?
и что он делает?
просто считает хеш и сравнивает с юзеровым?

Sergey
04.10.2017
08:59:42

Sergey
04.10.2017
08:59:49
или проверяет можно ли взять такой пароль?
если проверка на можно ли взять пароль - то вполне годно
если нет - то место в методе юзера
задача к ООП относится?

Sergey
04.10.2017
09:02:48

Google

Sergey
04.10.2017
09:02:58
в данном случае концепция пароля или что-то связанное с доступом

Sergey
04.10.2017
09:03:21
не понял поинта

Crosser
04.10.2017
09:10:30

Sergey
04.10.2017
09:12:31
вот взять https://github.com/voxsim/password-verifier-kata
в понятии этой каты верификация пароля это как раз валидация

Sergey
04.10.2017
09:13:27
почему бы не проводить эту валидацию в конструкторе класса Password?)

Sergey
04.10.2017
09:13:35
отлично
теперь добавим верификацию что пароль не должен быть таким как предыдущие
а так же он не должен быть в списке паролей, которые чаще всего используются

Sergey
04.10.2017
09:14:47
первая проверка ложится в User а вторая проверка - тут есть варианты. Откуда твой PasswordVerifier узнает словарь паролей?

Sergey
04.10.2017
09:15:05
это уже его детали, клиенту пофиг

Sergey
04.10.2017
09:16:16
ну тогда будет какой-то CommonPasswordDictionary который можно даже передать в статический метод-фабрику пароля

Sergey
04.10.2017
09:16:55
>первая проверка ложится в User а вторая проверка - тут есть варианты
ты еще предлагаешь в юзера ложить правила валидации?

Sergey
04.10.2017
09:17:09
да, это ж история паролей юзера

Sergey
04.10.2017
09:17:09
а как же то что юзер должен быть всегда в валидном состоянии?

Sergey
04.10.2017
09:17:16
ну то есть это совершенно разные рулы
public function changePassword(Password $oldPassword, Password $newPassword)
{
// проверяем по истории паролей пользователя и кидаем ошибку чуть что
}
при создании юзера у нас история как бы пустая и там подобный рул не имеет смысла

Google

Sergey
04.10.2017
09:18:26
как это будет выглядеть? $user->changePassword($password), а внутри ты делаешь все валидации?

Sergey
04.10.2017
09:18:55

Sergey
04.10.2017
09:19:24
password should be larger than 8 chars
password should not be null
password should have one uppercase letter at least
password should have one lowercase letter at least
password should have one number at least
еще вот эти правила нужны, и в случае чего показать их клиенту
если он нарушил чего

Sergey
04.10.2017
09:19:57
давай разберемся, тебя валидатор строк интересует ддя UI или ты хочешь бизнес правила установить?*
а, есть еще вариант
вместо исключений юзать доменные ивенты)
InvalidPasswordUsed

Sergey
04.10.2017
09:20:42

Sergey
04.10.2017
09:20:49
ну либо ты будешь смешивать проверку бизнес правил и UI kогику (отображение ошибок валидации)

Sergey
04.10.2017
09:21:46
я хочу получить ValidationViolations, а как его буду юзать это другой вопрос

Sergey
04.10.2017
09:22:06

Adel
04.10.2017
09:22:08
честно говоря пароль юзера... разве это домен?

Sergey
04.10.2017
09:22:25

Sergey
04.10.2017
09:22:26
список правил которые должны соблюдаться и ValidationViolations, если что-то нарушено

Sergey
04.10.2017
09:22:56

Sergey
04.10.2017
09:23:23
без разницы, это могут быть просто логи

Google

Sergey
04.10.2017
09:23:35
это уже не должно касаться задачи

Sergey
04.10.2017
09:24:07
ты сам усложняешь себе жизнь за счет того что все проверки должны быть проведены разом. То есть мы по любому должны иметь дело с невалидным стэйтом. А это значит что мы уходим из домена и переходим в страшный процедурный мир инфраструктуры

Sergey
04.10.2017
09:24:12
т.е булевой результат не ок, эксепшенами в натяжку можно решить это, но это гавно
ты опять от темы уходишь
я говорю что мне без разницы где ты валидировать будешь первичный пароль

Sergey
04.10.2017
09:24:53

Sergey
04.10.2017
09:24:53
можешь хоть в каждом слое по одному рулу проверять
теперь возвращаемся к PasswordVerifier

Sergey
04.10.2017
09:25:08
стой
нет
погоди

Sergey
04.10.2017
09:26:51
>2. Если пароль содержится в словаре, то его не может быть в истории юзеров
может быть исключение, если словарь обновляется

Sergey
04.10.2017
09:28:20
User::builder()
->withPassword(Password::fromString($password, $commonPasswordDictionary);
$user->changePassword(Password::fromString($oldPassword), Password::fromString($oldPassword, $commonPasswordDictionary))

Sergey
04.10.2017
09:29:11
или добавляем

Sergey
04.10.2017
09:29:36
с добавлением проблем не будет. У тебя даже если в истории у кого-то оно есть, ты об этом не узнаешь даже (хэш же)
да и если есть - снова уже быть не может

Google

Sergey
04.10.2017
09:30:31
старая соль + новый пароль =(возможность) старый хеш

Sergey
04.10.2017
09:30:45
ну и опять же что делать с чуваками которые при обновлении твоих правил по паролям оказывается юзают невалидный?)

Sergey
04.10.2017
09:30:58

Sergey
04.10.2017
09:31:08
это ж снижает секьюрность

Sergey
04.10.2017
09:31:30
хотя можно прислать им письмо что чуваки, ваш пароль есть в базе, которую слили)

Sergey
04.10.2017
09:31:45

Sergey
04.10.2017
09:32:29
а как ты проверишь не юзался ли пароль, если не использовать старую соль?

Sergey
04.10.2017
09:32:30
и я не хочу что бы логика хэширования просачивалась в моего юзера
делаешь просто password_verify для всех этих штук