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

BloodyX

Seçkin madenci.
Topluluk Yöneticisi
Katılım
26 Şubat 2020
Mesajlar
133
En iyi cevaplar
2
Tepki puanı
20
Puanları
1,080
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