Предыдущий ролик Следующий ролик  

Видео урок: Seeding roles and assignments

Основы ASP.NET MVC 5

Продолжая проект с того момента, на котором мы остановились в предыдущем видео, давайте теперь обсудим несколько быстрых способов настройки ролей в базе данных, а также назначение этих ролей пользователям, для того чтобы можно было протестировать функциональность Администратора. Чтобы добавить в базу данных несколько ролей и назначить эти роли пользователям, используйте метод Seed класса Configuration, расположенного в папке Migrations. Принято передавать в этот метод экземпляр ApplicationDBcontext. Чтобы создать пользователя Администратор и роль Администратор, а затем назначить эту роль пользователю, мы должны получить экземпляр класса UserManager.

Для этого нужно сначала создать экземпляр UserStore. Укажем класс ApplicationUser и передадим в него DbContext. А для этого нужно разрешить несколько пространств имен. После создания UserStore можно приступить к созданию UserManager, опять же, указав класс ApplicationUser и передав в него только что созданный нами Store. Итак, теперь мы можем работать либо напрямую с DbContext, либо с UserManager, каждый из которых по-разному обращается к таблице Users.

Возможно, нам захочется создать менеджера ролей, но для простоты я буду обращаться к совокупности ролей напрямую через DbContext. Поскольку этот метод Seed будет выполняться при каждом выполнении команды Update-Database, нам нужно использовать такие методы, как AddOrUpdate. В отличие от обычного метода Add метод AddOrUpdate проверяет существующие записи. А если бы нам нужно было воспользоваться методом UserManager.Create(), который в качестве параметра может принимать неотформатированный пароль, то мы могли бы сначала проверить существующего пользователя с помощью метода Any класса DbContext.

Итак, можно задать такое условие: if(!context.users.Any), а затем передать лямбда-выражение, указывающее на необходимость проверки существующего пользователя с указанным именем. В качестве имени укажем - admin@mvcatm.com. Если пользователя с таким именем не существует, можно объявить нового пользователя и задать для него и имя, и адрес электронной почты.

Как я уже упоминал, в шаблоне проекта представление Login запрашивает адрес электронной почты, но потом передает этот адрес в виде имени пользователя, поэтому считается, что имя пользователя и адрес электронной почты - это одно и то же. Возможно, вас это слегка раздражает, но вы можете все сделать по-своему. Итак, после создания пользователя вызовем метод UserManager.Create() и передадим в него этого пользователя вместе с текстовым паролем. Пароль должен быть валидным, поэтому в нем должна присутствовать как минимум одна заглавная буква, одна цифра, а также не алфавитно-цифровой символ.

Пользователь будет создан незамедлительно. Необязательно явно сохранять изменения. Не забывайте, что после создания пользователя нам нужно задать для него текущий счет с помощью CheckingAccountService. Конструктор CheckingAccountService() принимает в качестве параметра DbContext, поэтому мы передадим в него тот, который у нас уже есть. Итак, введем "admin", "user" - в качестве имени, передадим идентификатор нового пользователя, и пусть начальный баланс этого счета будет равен 1 000 долларов.

Для создания роли Администратор вызовем метод AddOrUpdate для набора ролей и передадим новую роль под названием "Admin". Указанное лямбда-выражение говорит о том, что нужно искать существующую запись с помощью свойства Name. Для того чтобы добавить к этой роли нового пользователя, нужно сначала вызвать метод SaveChanges. Теперь роль появилась в базе данных. Наконец, можно использовать метод UserManager.AddToRole, чтобы назначить новому пользователю роль Администратор.

Давайте выполним команду Update-Database и протестируем полученный код. Итак, консоль диспетчера пакетов говорит, что она выполняет метод Seed. Перейдем к представлению List и нажмем клавишу Ctrl+F5, чтобы построить решение и увидеть эту страницу. Обратите внимание, что несмотря на то, что я уже авторизован в системе, меня все равно отправляют на страницу авторизации, поскольку у меня нет прав на просмотр страницы List. Поэтому давайте войдем в систему под новым, только что созданным нами аккаунтом администратора.

Как видите, я получаю список счетов системы. Большинство ссылок на этой странице предназначены для еще не реализованных действий, но если нажать на ссылку Details, то можно будет просмотреть баланс любого счета. Итак, как видите, если в вашей базе данных настроено несколько ролей и назначений, то применять к действию контроллера авторизацию на основе ролей довольно легко.