- 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.
Gereksinimler
MySQL Veritabanı Oluşturma
phpMyAdmin veya Konsol Üzerinden:
plugin.yml Dosyası
MySQL Bağlantı Sınıfı (Database.java)
Not: Bilgileri config.yml içine alman önerilir.
Hash Sistemi (Security.java)
Ana Sınıf (Main.java)
Komut Sistemi (PinCommand.java)
Doğrulama Kontrolü (PinListener.java)
Güvenliği Artırmak İçin Ekstra Önlemler
Yaygın Hatalar
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
Bu rehberde, Admin PIN bilgilerini MySQL veritabanında saklayan güvenli bir sistemin nasıl yapılacağını öğreneceksiniz.
- Spigot / Paper Sunucu
- Java JDK 8+
- MySQL / MariaDB
- Temel Java Bilgisi
phpMyAdmin veya Konsol Üzerinden:
Kod:
CREATE DATABASE adminpin;
USE adminpin;
CREATE TABLE pins (
uuid VARCHAR(36) PRIMARY KEY,
pin_hash TEXT NOT NULL
);
Kod:
name: AdminPinMySQL
version: 1.0
main: me.adminpin.Main
api-version: 1.20
commands:
adminpin:
description: Admin PIN Sistemi
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.
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;
}
}
}
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;
}
}
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;
}
}
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!");
}
}
}
}
- 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