Dikkat! Kimlik kontrolü: Mernis & SpringBoot

Duygu Orhan
folksdev
Published in
4 min readMay 24, 2024

Herkese merhabaa, uygulama geliştirirken Türkiye Cumhuriyeti’nin kimlik kontrolünü sağlayan bir servisini kullanabildiğimizi biliyor muydunuz? Peki bu servis nedir ve nasıl kullanılır? Hadi gelin birlikte bakalım 👩🏻‍💻💚

Mernis & KPS nedir?

Merkezi Nüfus İdaresi Sistemi (MERNİS), Türkiye Cumhuriyeti vatandaşlarının nüfus kayıtlarının merkezi bir veri tabanında tutulduğu bir projedir. Kimlik Paylaşım Sistemi (KPS) ise, MERNİS veri tabanındaki kimlik bilgilerinin kamu kurumları ve yetkilendirilmiş tüzel kişiler tarafından kontrol edilebileceği ve paylaşılabileceği bir hizmettir. Bu hizmetin prosedürleri kabul eden herkese açık olması sayesinde biz de KPS API’sini kullanarak kimlik kontrolünü gerçekleştirebiliyoruz.

KPS servisini kullanabilmek için TC kimlik numarası ile kullanıcı kaydı doğrulayıp oluşturabileceğimiz basit bir proje oluşturalım 👇🏻

Projeyi spring initializer sayfasına giderek oluşturuyoruz. Bu bir maven projesi ve ilgili dependencys: Lombok, JPA, Spring Web, SpringBoot DevTools, PostgreSQL Driver.

Öncelikle PostgreSql’de UserRegister adında bir veri tabanı oluşturalım ve sonrasında projeye gelip resources kısmında properties uzantılı dosyayı yaml uzantılı dosyaya çevirelim. Bize gerekli olan veri tabanı ve jpa tanımlamalarını yazalım.

spring:
application:
name: mernisConfig
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: update
show-sql: true
datasource:
url: jdbc:postgresql://localhost:5432/UserRegister
username: postgres
password: test

Model package oluşturup içerisine User sınıfımızı tanımlayalım. Burada bizim için gerekli olan ad, soyad, doğum tarihi ve TC kimlik numarasını tanımlayarak business katmanında kontrol işlemlerini gerçekleştirerek kayıt oluşturacağız.

package com.example.mernisConfig.model;


import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDate;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String firstName;
private String lastName;
private LocalDate birthOfDateYear;
private String identityNumber;
private String email;
}

Oluşturduğumuz User sınıfının UserRepository interface’ini oluşturarak veri tabanı işlemlerini kolaylaştırıyoruz. Servis sınıfını oluşturmadan önce burada kullanacağımız mernis sistemini kurma vakti geldi. Yeni bir package oluşturarak adına ‘mernis’ diyelim. Eğer ilk defa bir web servisi ekleyecekseniz projenize muhtemelen ilgili plugin bulunmayacaktır. Bu yüzden öncelikle easyWSDL plugin ekliyoruz ki dışarıdan servisi ekleyip kullanabilelim.

File üzerine gelerek proje ayarlarına gidelim:

Buradan da plugin kısmına gelerek easyWSDL generator’ı aratalım ve install yapalım:

Oluşturduğumuz package üstüne gelerek sağ click yaparak en alttaki easyWSDL - add web service seçeneğine tıklayarak hesap oluşturuyoruz.

Hesap oluşturduktan sonra, tekrardan add web service diyerek çıkan yeni pencerede URL kısmına kullanacağımız mernis KPS servisini veriyoruz. Language ‘Java’ olarak seçip, işlemi tamamlıyoruz. (https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx)

Ve artık ilgili sınıflar package içerisinde. Proje dosyasında oluşan jar dosyalarını da module olarak eklememiz gerekli.

File →Project Structure → Modules e gelerek easyWsdl klasöründeki jar dosyalarını seçiyoruz ve bunları projeye yüklüyoruz.

Artık mernis servisini projemize bağladık ve ilgili sınıfları kullanarak kimlik kontrolümüzü gerçekleştiren kodu yazabiliriz. UserService sınıfını oluşturabiliriz. Aşağıdaki servis kodunda mernis package’ında bulunan CQRKPSPublicSoap sınıfından bir obje oluşturuyoruz. (Muhtemelen eğer siz projeyi kendiniz oluşturursanız sınıfların önündeki 3 harf değişecektir.) Bu oluşturduğumuz objede TCKimlikNoDoğrulama metodunu çağırarak ve içerisine obje değerlerini göndererek kontrol ediyoruz. Eğer sonucumuz true dönerse bu bilgilere sahip bir TC vatandaşı bulunmakta, false ise bu bilgilerle kayıtlı bir TC vatandaşı bulunmamaktadır.

package com.example.mernisConfig.service;

import com.example.mernisConfig.mernis.CQRKPSPublicSoap;
import com.example.mernisConfig.model.User;
import com.example.mernisConfig.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.apache.coyote.BadRequestException;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public String registerUser(User user) throws Exception {
CQRKPSPublicSoap client= new CQRKPSPublicSoap();
boolean isRealPerson = client.TCKimlikNoDogrula(
Long.valueOf(user.getIdentityNumber()),
user.getFirstName(),
user.getLastName(),
Integer.valueOf(user.getBirthOfDateYear().getYear()));

if(isRealPerson){
userRepository.save(user);
return "kullanıcı başarıyla kayıt edildi";

}
else {
throw new IllegalArgumentException("Kullanıcı bulunamadı!");
}

}

}

En son da controller sınıfımızı oluşturarak kullanıcı oluşturmak için bir post metodu tanımlıyoruz.

package com.example.mernisConfig.controller;

import com.example.mernisConfig.model.User;
import com.example.mernisConfig.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
public class UserController {

private final UserService userService;

@PostMapping
public ResponseEntity<String> register(@RequestBody User user) throws Exception {
return ResponseEntity.ok(userService.registerUser(user));
}
}

Kodumuzun son halini doğru kullanıcı bilgileri girerek Postman’den istek atıp doğrulayalım:

Bu kodlara ulaşmak isterseniz Github Repository burada.

Okuduğunuz için teşekkür ederim. Umarım sizler için faydalı bir yazı olmuştur 🫶🏻

Eğer yazılarım ilginizi çekiyorsa beni takip etmeyi unutmayın ✨💐
X | LinkedIn | GitHub

Bir sonraki yazıda görüşmek üzere, sağlıcakla kalın🙌🏻

--

--