MVC Rol Yönetimi

WEB sayfalarının olmazsa olmazı tabiki kullanıcılardır. Bu durum kullanıcıların yönetilmesi durumunu doğurmaktadır. Örneğin bir şirkete ait Personeli ele alalım.Personelin yetki durumuna göre WEB sayfasında istenilen yerler kullanıma açılmalı, istenmeyen yerler kapatılmalıdır. 

Aşağıdaki FormAutoDB adlı veritabanında oluşturulmuş  KullaniciTBL isimli bir tablodur

.

Bu tabloyu örnek olarak şu şekilde veri girişi yaptık.

Kullanici_Rol alanına girdiğim veriler.

M -->Müdür

S -->Şef

P -->Personel

Yetkilerini ifade etsin.

Senaryomuz şöyle proje çalıştırıldığında Kullanıcı Giriş ekranı gelecek, kullanıcı adı ve şifre doğru girildiğinde yetkiye göre ilgili WEB ekranına ulaşılacak. Form Authentication ile ilgili yazıma buradan ulaşabilirsiniz.

Kullanıcı ekranımız.

WEB sayfamızda MVC nin örnek arayüzü olsun.


Yetki durumuna göre işaretlediğim linkler kullanıcılara açık yada kapalı olsun. Kullanıcı giriş ekranı için LoginController oluşturduk ve kodumuz şöyle;

  [AllowAnonymous] //Tüm kullanıcılar login sayfasına ulşabilmesi için bu tanımı yaptık.
    public class LoginController : Controller
    {
       public ActionResult Index()
        {
            return View();
        }
        FormAutoDBEntities db = new FormAutoDBEntities();
        [HttpPost]
        public ActionResult Giris(KullaniciTBL k)
        {
            var kullanici = db.KullaniciTBL.Where(x => x.Kullanici_Adi == k.Kullanici_Adi && x.Kullanici_Parola==k.Kullanici_Parola).FirstOrDefault();
            if (kullanici!=null)
            {
                FormsAuthentication.SetAuthCookie(k.Kullanici_Adi,false );
                return RedirectToAction("Index","Home");
            }
            ViewBag.Hata = "Kullanıcı adı veya şifre hatalı";
            return View("Index");
        }
        public ActionResult Cikis()
        {
           FormsAuthentication.SignOut();
           return RedirectToAction("Index","Home");
        }
    }

Form Authentication ile ilgili Web.Config sayfamızdaki ayarımız.

<system.web>
   ...........
    <authentication mode="Forms">
     <forms loginUrl="Login/Index" timeout="20" slidingExpiration="true "></forms>
    </authentication>
   ..............
  </system.web>

Global.asax dosyasındaki ayarımız;

protected void Application_Start()
  {
    GlobalFilters.Filters.Add(new AuthorizeAttribute());
   RouteConfig.RegisterRoutes(RouteTable.Routes);
   BundleConfig.RegisterBundles(BundleTable.Bundles);
  }

Evet şimdi Solution Explorerda proje üzerine sağ tık yapalım ve Roller isimli bir klasör oluşturalım. Roller klasöründe sağ tık yapalım ve Add - Class seçeneğini seçelim. Ben Classa KullaniciRol ismini verdim. Oluşan Class aşağıdaki gibidir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RolYonetimi.Roller
{
    public class KullaniciRol
    {
    }
}

KulaniciRol ifadesinin yanına iki nokta üstüstte koyalım ve RoleProvider yazalım.Şöyle;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RolYonetimi.Roller
{
    public class KullaniciRol : RoleProvider
    {
    }
}

RoleProvider altı kırmızı ile çizilecektir.İmleci üzerine getirip Ctrl+ .(nokta) tuş bileşimine basalım. Aşağıdaki using ifadesini seçelim.

Şimdi implement(hazır class ekleme) işlemi yapacağız. KullaniciRol ifadesi üzerine gelin ve çıkan işaretin yanındaki oka tıklayıp Implement Abstract Class seçeneğini seçiniz.

Son durumda;

using RolYonetimi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace RolYonetimi.Roller
{
    public class KullaniciRol : RoleProvider
    {
        public override string ApplicationName
        {
            get
            {
                throw new NotImplementedException();
            }

            set
            {
                throw new NotImplementedException();
            }
        }

        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }

        public override void CreateRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
        {
            throw new NotImplementedException();
        }

        public override string[] FindUsersInRole(string roleName, string usernameToMatch)
        {
            throw new NotImplementedException();
        }

        public override string[] GetAllRoles()
        {
            throw new NotImplementedException();
        }

        public override string[] GetRolesForUser(string username)
        {
            throw new NotImplementedException();
        }

        public override string[] GetUsersInRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override bool IsUserInRole(string username, string roleName)
        {
            throw new NotImplementedException();
        }

        public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }

        public override bool RoleExists(string roleName)
        {
            throw new NotImplementedException();
        }
    }
}
Evet sarı renkle işaretlediğim metodu aşağıdaki gibi kodlayalım.
  FormAutoDBEntities db = new FormAutoDBEntities();
  public override string[] GetRolesForUser(string username)
  {
      var kullanici = db.KullaniciTBL.FirstOrDefault(x =>x.Kullanici_Adi == username);
      return new string[] { kullanici.Kullanici_Rol };

  }
Rol yönetimi ilgili Web.Config dosyasına şu satırları ekleyelim.
  <system.web>
   ............
    <authentication mode="Forms">
      <forms loginUrl="Login/Index" timeout="20" slidingExpiration="true "></forms>
    </authentication>
    <roleManager enabled="true" defaultProvider="roller">
      <providers>
        <add name="roller" type="RolYonetimi.Roller.KullaniciRol" />
      </providers>
    </roleManager>
  </system.web>

Evet ayarlarımız bitti. Rol yönetimini iki başlık altında inceleyelim.
1.View Bölümünde Kullanma
Yetkisi M yani Müdür olan Personelle ilgili tüm linkleri görebilir ve işlem yapabilir.
  @if (User.IsInRole("M"))
  {
      <ul class="nav navbar-nav">
          <li>@Html.ActionLink("Personel Kayıt", "Index", "Home")</li>
          <li>@Html.ActionLink("Personel Ödül", "About", "Home")</li>
          <li>@Html.ActionLink("Personel Ceza", "Contact", "Home")</li>
      </ul>
  }

Yetkisi M yani Müdür veya S yani Şef olan Personelle ilgili tüm linkleri görebilir ve işlem yapabilir.
 @if (User.IsInRole("M") || User.IsInRole("S"))
   {
    <ul class="nav navbar-nav">
        <li>@Html.ActionLink("Personel Kayıt", "Index", "Home")</li>
        <li>@Html.ActionLink("Personel Ödül", "Odul", "Home")</li>
        <li>@Html.ActionLink("Personel Ceza", "Ceza", "Home")</li>
    </ul>
   }

2.Controller Bölümünde Kullanma
Yetkisi M ve S olan Personeller Ceza Actionu üzerinde işlem yapabilir. Diğer personel Personel Ceza linkine tıklarsa Kullanıcı Giriş sayfası açılır.
 [Authorize(Roles ="M,S")]
  public ActionResult Ceza()
  {
      ViewBag.Message = "Ceza sayfası.";
      return View();
  }

Personel Ceza linkine sadece M yetkisine sahip kişi ulaşabilir.
 [Authorize(Roles ="M")]
  public ActionResult Ceza()
  {
      ViewBag.Message = "Ceza sayfası.";
      return View();
  }
Faydalı olması dileğiyle kolay gelsin.


Etiketler
Rol Provider Roles Authorize Allowanonymous Global
Mesaj Yaz