Как сделать RoleFilter по моей собственной базе в MVC3 - PullRequest
0 голосов
/ 12 августа 2011

В моей базе данных есть таблица User, и в ней есть поле «Тип».Есть 3 типа пользователей, издатель, аудиторы и администраторы.Я хочу знать, как я могу использовать какой-то фильтр, например [Authorize (Role = "Publisher")], чтобы фильтровать пользователей, вошедших в систему ????

1 Ответ

0 голосов
/ 12 августа 2011

Атрибут [Authorize (Role = "")], насколько я понимаю, используется при использовании поставщика ролей. Вы можете сделать свой собственный довольно легко - см. эту ссылку для руководства.

Обычно я использую таблицу User, таблицу Role и таблицу UserInRole. Таблица ролей просто имеет идентификатор роли, такой как «Администратор», и описание. Таблица UserInRole является таблицей соединений, которая связывает идентификатор пользователя с идентификатором роли.

Таким образом, пользователь может принадлежать к нескольким ролям, а не быть привязанным только к одной.

Пожалуйста, обратите внимание, что это то, как я это делаю - и это не обязательно правильный путь. Если вы хотите использовать свое поле "type" в пользовательской таблице, это все равно будет работать - ваш поставщик ролей будет реализован иначе, чем мой.

РЕДАКТИРОВАТЬ: Кроме того - атрибут [Authorize] будет работать только с поставщиком членства, и не требуется иметь поставщика роли. Я думаю, что синтаксис [Authorize (User = "User1, User2")] или что-то в этом роде.

РЕДАКТИРОВАТЬ: Чтобы перевести пользователя на страницу с ошибкой, указывающую, что он не в правильной роли, вы можете добавить некоторую настраиваемую логику для вашего метода входа в свой AccountController:

[HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {

                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    if (!User.IsInRole("MyRole"))
                    {
                        return Redirect("Error");

                    }
                    else
                    {
                        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                        {
                            return Redirect(returnUrl);
                        }
                        else
                        {
                            return RedirectToAction("Index", "Home");
                        }

                    }

                }
                else
                {
                    ModelState.AddModelError("", "The email or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }
...