UserPlugin
    • 26 Dec 2023
    • 2 Minutes to read
    • Dark
      Light

    UserPlugin

    • Dark
      Light

    Article summary

    PaperWork mimarisi her türlü kullanıcı kaynağı ile senkronize olabilir. Senkronizasyon işlemi esnasında kullanıcının şifresi alınmaz. Kullanıcı her login denemesi yaptığında kullanıcı adı ve şifresi ile ilgili sistemden doğrulama yapmak gerekir. Bu bölümde dahili kullanıcı ve aktif dizin haricindeki kaynaklardan senkronize edilen kullanıcıların doğrulaması için gereken eklenti geliştirme yöntemi açıklanmıştır.

    İlk önce .Net geliştirme ortamında yeni bir kütüphane oluşturmalısınız. PaperWork eklenti kütüphaneleri “Paperwork.” ön eki ile başlamalıdır ve oluşturduğunuz kütüphaneyi X64 ve .Net Framework 4.7.2 veya üst versiyonları olarak ayarlanmalıdır.

    Daha sonra   kütüphaneye “Paperwork.PlugIn.dll” kütüphanesini referans olarak eklenmelidir. Bu kütüphane yazılacak eklentinin tanımlanacağı “IAuthPlugIn” interface ini içerir.

    Dışarıdan Kullanıcı Girişi
    Dışarıdan kullanıcı doğrulaması yapılacak ise, bu kullanıcıların PaperWork kullanıcı tanımlarında kayıtlı olması gerekmektedir.

    Daha sonra kütüphaneye yeni bir sınıf eklemeli ve oluşturulan sınıf “IAuthPlugIn” interface’ini kullanacak şekilde tanımlanmalıdır.

    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace Paperwork.Training.Plugin
    {
        public class UserAuth : IAuthPlugIn
        {
            public bool ValidateUser(string aUsername, string aPassword, out string aErrorCode, out string aMessage)
            {
                throw new NotImplementedException();
            }
       }
    }

    Interface tanımlaması ile gelen “ValidateUser” metodunun içinde kullanıcı doğrulaması yapılır. Kullanıcı bilgileri geçerli ise “true” değeri dönülür. Geçersiz ise “aErrorCode” değişkenine hata kodunu, “aMessage” değişkenine hata açıklamasını yazarak “false” değerini dönmek gerekir. 

    Kullanıcı doğrulaması herhangi bir dış sistemden yapılabilir. Bu sistem kodlama ile erişilebilen herhangi bir sistem (müşteri veri tabanı, web servisi, active directory vs.) olabilir.

    Hazırlanan eklentiyi kullanmak için öncelikle kütüphane derlenmeli ve oluşan kütüphane içerik sunucusunun kurulu olduğu makine üzerine varsayılan olarak “C:\Paperwork\Bin\Plugins” dizini altına taşınmalıdır. Oluşturduğumuz kütüphane projesinin ismi ve dll dosyasının adı “Paperwork.” ile başlamalıdır. 

    “Plugins" klasörü içerisine taşınan eklentinin aktif hale gelmesi için content server sunucusunu yeniden başlatılması gereklidir. Doğrulaması eklenti ile yapılacak olan PaperWork kullanıcılarının (PW_USER Tablosunda) “Source” alanında eklentinin adı (bizim örneğimiz için “Paperwork.Training.Plugin.UserAuth”) yazmalıdır. 

    Kullanıcı tanımları sayfasından, kullanıcı bilgilerini doğrulama şeklini kendi oluşturduğumuz kütüphane kurallarına göre değiştireceğimiz kullanıcıların “Kaynak” seçimini “aktif dizin” yaptıktan sonra “Domain Adresi” alanına kütüphane ismini ve sınıf ismini vererek değiştirebiliriz. Önyüzde “Domain Adresi” olarak görünen alan veritabanında “SOURCE” kolonuna eş gelmektedir.

    PaperWork kullanıcıları için gerekli düzenlemeyi yaptıktan sonra Eklenti tanımlaması yapılmış olan kullanıcılardan biri ile oturum açmayı denediğimizde şifre kontrolü PaperWork üzerinden değil, tanımladığımız kütüphane üzerinden yapılacaktır.

    Örnek uygulama aşağıdaki gibidir;

    using Paperwork.PlugIn;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace Paperwork.Training.Plugin
    {
        public class UserAuth : IAuthPlugIn
        {
            private const string ConnStr = "Data Source=ARGUSDB;Initial Catalog=TrainingPaperwork;Persist Security Info=True;User ID=trainer;Password=gg";
            public bool ValidateUser(string aUsername, string aPassword, out string aErrorCode, out string aMessage)
            {
                bool valid = false;
                aErrorCode = "0";
                aMessage = string.Empty;
                try
                {
                    valid = Validate(aUsername, aPassword);
                    if (!valid)
                    {
                        aErrorCode = "1";
                        aMessage = "Hatalı kullanıcı adı/şifre";
                    }
                }
                catch (Exception ex)
                {
                    aErrorCode = "2";
                    aMessage = ex.Message;
                }
                return valid;
            }
    
    
            private bool Validate(string userName, string password)
            {
                using (var conn = new SqlConnection(ConnStr))
                {
                    using (var cmd = new SqlCommand(string.Format("SELECT COUNT(*) AS CNT FROM COMPANY_USERS WHERE USER_NAME = '{0}' AND PASSWORD='{1}'", userName, password), conn))
                    {
                        conn.Open();
                        using (var reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                return Convert.ToInt32(reader[0]) > 0;
                            }
                        }
                    }
                }
                return false;
            }
    
        }
    }

    What's Next