Nop Commerce Eklentilerinde Kullanıcı Yetkilendirmesi

Nopcommerce logo

Merhaba Arkadaşlar,

NopCommerce'e eklenti yazarken, arka panel işlemlerini, sınırlandırmak isteyebilirsiniz.

Mesela, NopCommerce'te yönetici panelinden, kategori vs. eklemek istediğinizde, arka tarafta şuna benzer bir kod ile kontrol yapılır.

 if (!_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
                return AccessDeniedView();

Not : Bu kodu Nop.Admin.Controllers.CategoryController.cs dosyasında görebilirsiniz.

Görüldüğü üzere eğer, talepte bulunanın yetkisi yeterli değilse, sistem yetkisiz erişim bildirim sayfasına yönlendirmektedir.

Aynen yukarıdaki şekilde bizde, erişimi kontrol edebiliriz. Ancak bir sorun var. 

StandardPermissionProvider'da ki erişim seçenekleri aşağıdaki gibidir.

public static readonly PermissionRecord AccessAdminPanel;
public static readonly PermissionRecord AllowCustomerImpersonation;
public static readonly PermissionRecord DisplayPrices;
public static readonly PermissionRecord EnableShoppingCart;
public static readonly PermissionRecord EnableWishlist;
public static readonly PermissionRecord HtmlEditorManagePictures;
public static readonly PermissionRecord ManageAcl;
public static readonly PermissionRecord ManageActivityLog;
public static readonly PermissionRecord ManageAffiliates;
public static readonly PermissionRecord ManageAttributes;
public static readonly PermissionRecord ManageBlog;
public static readonly PermissionRecord ManageCampaigns;
public static readonly PermissionRecord ManageCategories;
public static readonly PermissionRecord ManageCountries;
public static readonly PermissionRecord ManageCurrencies;
public static readonly PermissionRecord ManageCurrentCarts;
public static readonly PermissionRecord ManageCustomers;
public static readonly PermissionRecord ManageDiscounts;
public static readonly PermissionRecord ManageEmailAccounts;
public static readonly PermissionRecord ManageExternalAuthenticationMethods;
public static readonly PermissionRecord ManageForums;
public static readonly PermissionRecord ManageGiftCards;
public static readonly PermissionRecord ManageLanguages;
public static readonly PermissionRecord ManageMaintenance;
public static readonly PermissionRecord ManageManufacturers;
public static readonly PermissionRecord ManageMeasures;
public static readonly PermissionRecord ManageMessageQueue;
public static readonly PermissionRecord ManageMessageTemplates;
public static readonly PermissionRecord ManageNews;
public static readonly PermissionRecord ManageNewsletterSubscribers;
public static readonly PermissionRecord ManageOrders;
public static readonly PermissionRecord ManagePaymentMethods;
public static readonly PermissionRecord ManagePlugins;
public static readonly PermissionRecord ManagePolls;
public static readonly PermissionRecord ManageProductReviews;
public static readonly PermissionRecord ManageProducts;
public static readonly PermissionRecord ManageProductTags;
public static readonly PermissionRecord ManageRecurringPayments;
public static readonly PermissionRecord ManageReturnRequests;
public static readonly PermissionRecord ManageScheduleTasks;
public static readonly PermissionRecord ManageSettings;
public static readonly PermissionRecord ManageShippingSettings;
public static readonly PermissionRecord ManageStores;
public static readonly PermissionRecord ManageSystemLog;
public static readonly PermissionRecord ManageTaxSettings;
public static readonly PermissionRecord ManageTopics;
public static readonly PermissionRecord ManageVendors;
public static readonly PermissionRecord ManageWidgets;
public static readonly PermissionRecord PublicStoreAllowNavigation;

Yukarıdaki varsayılan, erişim türlerine ek olarak kendi erişim türlerimizi eklemek için aşağıdaki adımları takip etmemiz yeterli olacaktır.

  • Öncelikle eklentimizi yazdığımız Class Library'in içerisine, bir Permission Provider sınıfı eklememiz gerekiyor.
  • Eklediğimiz sınıfı, Nop.Services.Security.IPermissionProvider interfacesinden kalıtıyoruz.
  • Eklediğimiz sınıf içerisine, kullanacağımız erişim türlerini private static olarak yazıyoruz. Burada aslında yazdığımız propertyler PermissionRecord sınıfı öğesi.
  • IPermissionProvider'ın varsayılan metodlarını implemente ediyoruz. 
  • Sınıfımızın kodları aşağıdakine benzer oluyor.
using Nop.Core.Domain.Security;
using Nop.Services.Security;
using System.Collections.Generic;
using System.Linq;

namespace Nop.Plugin.Widgets.DenemeProje.Security
{
    public partial class DenemeProjePermissionProvider : IPermissionProvider
    {
        public static readonly PermissionRecord ManageTheme = new PermissionRecord { Name = "Plugins. Deneme Proje - Manage Theme", SystemName = "DenemeProjeManageTheme", Category = "Plugin" };

        public virtual IEnumerable<PermissionRecord> GetPermissions()
        {
            return new[] 
            {
// Burada son öğeden sonra virgül eklemeye dikkat ediyoruz.
                ManageTheme,
            };
        }

        public virtual IEnumerable<DefaultPermissionRecord> GetDefaultPermissions()
        {
            return Enumerable.Empty<DefaultPermissionRecord>();

            //Varsayılan olarak yönetici izinlerini vermek isterseniz, aşağıdaki kod bloğunun yorum satırı özelliğini kaldırabilirsiniz.
            //return new[] 
            //{
            //    new DefaultPermissionRecord 
            //    {
            //        CustomerRoleSystemName = SystemCustomerRoleNames.Administrators,
            //        PermissionRecords = new[] 
            //        {
            //            ManageTheme,
            //        }
            //    },
            //};
        }
    }
}

Sınıfımızı oluşturduktan sonra ise, bu sınıfı kullanılabilecek şekilde aktif etmemiz gerekecektir. Bunun için ise, eklentinin kurulumu esnasında, yetkilerimizin sisteme otomatik olarak eklenmesini sağlayacağız.

  • BasePlugin sınıfını kalıttığımız sınıfı açıyoruz. (Genelde isim olarak sonu Plugin olarak biter.)
  • Sınıfımızın içerisine 
private readonly IPermissionService _permissionService;

fieldini ekliyoruz. 

  • Ardından Ctor(sınıfın varsayılan metodu) içerisinde 
 public DenemeProjePlugin(...... IPermissionService permissionService)
        {
            ............................
            _permissionService = permissionService;
        }

şeklinde fieldimize atamayı yapıyoruz.

  • Son olarak da, Install metodunun içerisine aşağıdaki gibi bir satır ekliyoruz.
 _permissionService.InstallPermissions(new DenemeProjePermissionProvider());
  • Uninstall metodunun içerisine de, aşağıdaki kodları eklediğimizde, eklentiyi kaldırdığımızda, eklediğimiz erişim ayarları sistemden silinecektir.
 _permissionService.UninstallPermissions(new DenemeProjePermissionProvider());

Böylelikle sistemimiz hazır hale geldi. 

Herhangi bir talepte, yetkilendirme kontrolü yapmak istersek, tek yapmamız gereken aşağıdaki gibi bir kontrol yapmak,

   if (!_permissionService.Authorize(DenemeProjePermissionProvider.ManageTheme))
                return AccessDeniedView();

Eğer, yetki verilmemiş ise otomatik olarak erişimin engellendiğine dair sayfa açılacaktır.

Son olarak eğer, NopCommerce panelinde, Configuration>Access Control List sayfasına bakılacak olursa, eklediğimiz erişim yetkisinin geldiğini görebileceğiz ve istediğimiz gibi yönetebileceğiz.

Not : Eğer eklentiniz, bu ayarı yapmadan öncede kuruluysa, yaptığınız değişiklik görünmeyecektir. Bunun için bu kodları yazmadan evvel, eklentiyi kaldırın, kodlarınızı yazın ve daha sonra eklentiyi kurun.