Rehber Minecraft MySQL Kayıtlı Admin PIN Sistemi – Java Plugin Rehberi

BloodyX

Seçkin madenci.
✨Yönetici
Katılım
26 Şubat 2020
Mesajlar
168
En iyi cevaplar
2
Tepki puanı
23
Puanları
1,080
Konum
Adıyaman
Web Sitesi
elysianw.com
Minecraft Kullanıcı Adı
HydrusHD
Dakikalar içinde aktif Minecraft sunucunu kur! Lag’sız, düşük pingli TR lokasyon ile kendi dünyanı oluştur, arkadaşlarınla oyna Hemen başla
Minecraft MySQL Kayıtlı Admin PIN Sistemi – Java Plugin Rehberi

Bu rehberde, Admin PIN bilgilerini MySQL veritabanında saklayan güvenli bir sistemin nasıl yapılacağını öğreneceksiniz.




1️⃣ Gereksinimler
  • Spigot / Paper Sunucu
  • Java JDK 8+
  • MySQL / MariaDB
  • Temel Java Bilgisi




2️⃣ MySQL Veritabanı Oluşturma

phpMyAdmin veya Konsol Üzerinden:

Kod:
CREATE DATABASE adminpin;

USE adminpin;

CREATE TABLE pins (
  uuid VARCHAR(36) PRIMARY KEY,
  pin_hash TEXT NOT NULL
);




3️⃣ plugin.yml Dosyası

Kod:
name: AdminPinMySQL
version: 1.0
main: me.adminpin.Main
api-version: 1.20
commands:
  adminpin:
    description: Admin PIN Sistemi




4️⃣ MySQL Bağlantı Sınıfı (Database.java)

Kod:
package me.adminpin;

import java.sql.*;

public class Database {

    private Connection connection;

    public void connect(){

        try {

            String url = "jdbc:mysql://localhost:3306/adminpin";
            String user = "root";
            String pass = "sifre";

            connection = DriverManager.getConnection(url, user, pass);

        } catch (SQLException e){
            e.printStackTrace();
        }
    }

    public Connection getConnection(){
        return connection;
    }
}

Not: Bilgileri config.yml içine alman önerilir.




5️⃣ Hash Sistemi (Security.java)

Kod:
package me.adminpin;

import java.security.MessageDigest;

public class Security {

    public static String hash(String text){

        try {

            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] bytes = md.digest(text.getBytes());

            StringBuilder sb = new StringBuilder();

            for(byte b : bytes){
                sb.append(String.format("%02x", b));
            }

            return sb.toString();

        } catch (Exception e){
            return null;
        }
    }
}




6️⃣ Ana Sınıf (Main.java)

Kod:
package me.adminpin;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {

    private static Database database;

    @Override
    public void onEnable(){

        database = new Database();
        database.connect();

        getCommand("adminpin")
        .setExecutor(new PinCommand(database));

        getServer().getPluginManager()
        .registerEvents(new PinListener(), this);

        getLogger().info("AdminPin MySQL Aktif!");
    }

    public static Database getDB(){
        return database;
    }
}




7️⃣ Komut Sistemi (PinCommand.java)

Kod:
package me.adminpin;

import org.bukkit.command.*;
import org.bukkit.entity.Player;

import java.sql.*;
import java.util.UUID;

public class PinCommand implements CommandExecutor {

    private Database db;

    public PinCommand(Database db){
        this.db = db;
    }

    @Override
    public boolean onCommand(CommandSender sender,
                             Command cmd,
                             String label,
                             String[] args){

        if(!(sender instanceof Player)) return true;

        Player p = (Player) sender;

        if(!p.isOp()){
            p.sendMessage("Yetkin yok.");
            return true;
        }

        if(args.length < 2){
            p.sendMessage("/adminpin set <pin>");
            p.sendMessage("/adminpin login <pin>");
            return true;
        }

        UUID uuid = p.getUniqueId();

        if(args[0].equalsIgnoreCase("set")){

            String hash = Security.hash(args[1]);

            try {

                PreparedStatement ps =
                db.getConnection().prepareStatement(
                "REPLACE INTO pins VALUES (?,?)");

                ps.setString(1, uuid.toString());
                ps.setString(2, hash);

                ps.executeUpdate();

                p.sendMessage("PIN kaydedildi.");

            } catch (SQLException e){
                e.printStackTrace();
            }
        }

        if(args[0].equalsIgnoreCase("login")){

            try {

                PreparedStatement ps =
                db.getConnection().prepareStatement(
                "SELECT pin_hash FROM pins WHERE uuid=?");

                ps.setString(1, uuid.toString());

                ResultSet rs = ps.executeQuery();

                if(!rs.next()){
                    p.sendMessage("Önce PIN ayarla.");
                    return true;
                }

                String saved = rs.getString("pin_hash");
                String input = Security.hash(args[1]);

                if(saved.equals(input)){

                    PinListener.verified.add(uuid);
                    p.sendMessage("Giriş başarılı!");

                } else {

                    p.sendMessage("Hatalı PIN!");
                }

            } catch (SQLException e){
                e.printStackTrace();
            }
        }

        return true;
    }
}




8️⃣ Doğrulama Kontrolü (PinListener.java)

Kod:
package me.adminpin;

import org.bukkit.event.*;
import org.bukkit.event.player.*;
import org.bukkit.entity.Player;

import java.util.HashSet;
import java.util.UUID;

public class PinListener implements Listener {

    public static HashSet<UUID> verified =
    new HashSet<>();

    @EventHandler
    public void onCommand(PlayerCommandPreprocessEvent e){

        Player p = e.getPlayer();

        if(p.isOp() && !verified.contains(p.getUniqueId())){

            if(!e.getMessage().startsWith("/adminpin login")){

                e.setCancelled(true);
                p.sendMessage("Önce PIN gir!");
            }
        }
    }
}




9️⃣ Güvenliği Artırmak İçin Ekstra Önlemler
  • Yanlış giriş limiti (3 deneme)
  • Kick / Ban sistemi
  • IP kontrolü
  • Discord doğrulama
  • Otomatik log kaydı




Yaygın Hatalar
  • PIN’i düz metin kaydetmek ❌
  • MySQL şifresini kodda bırakmak ❌
  • Hash kullanmamak ❌
  • Backup almamak ❌




Sonuç


Bu sistem sayesinde:
✔ PIN’ler kaybolmaz
✔ Sunucu restartında silinmez
✔ Güvenlik artar
✔ Profesyonel altyapı oluşur


MySQL + PIN = Güçlü Admin Güvenliği
 

Üst