javaspringspring-bootspring-security-kerberos

MiniKdc not available from org.springframework.security.kerberos.test.MiniKdc


I am trying to use "MiniKdc" in my code implementation like "MiniKdc.main(config)" but am getting error "can not resolve symbol 'MiniKdc' ".

I am following this example https://www.baeldung.com/spring-security-kerberos-integration

i have added this dependecy in my build.gradle implementation 'org.springframework.security.kerberos:spring-security-kerberos-test:1.0.1.RELEASE'

i tried to search the dependecy from maven central/repository and i can't find it.

here is the class i am working on, i want to be able to import Minikdc in the second import statement.

import org.apache.commons.io.FileUtils;
import org.springframework.security.kerberos.test.MiniKdc;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

class KerberosMiniKdc {

    private static final String KRB_WORK_DIR = ".\\spring-security-sso\\spring-security-sso-kerberos\\krb-test-workdir";

    public static void main(String[] args) throws Exception {

        String[] config = MiniKdcConfigBuilder.builder()
                .workDir(prepareWorkDir())
                .confDir("minikdc-krb5.conf")
                .keytabName("example.keytab")
                .principals("client/localhost", "HTTP/localhost")
                .build();

        MiniKdc.main(config);
    }

    private static String prepareWorkDir() throws IOException {
        Path dir = Paths.get(KRB_WORK_DIR);
        File directory = dir.normalize().toFile();

        FileUtils.deleteQuietly(directory);
        FileUtils.forceMkdir(directory);
        return dir.toString();
    }
}

is there anything am doing wrong?


Solution

  • As of 2021, spring-security-kerberos is not well maintained.

    I suggest using Apache Kerby instead, either directly or via other library like Kerb4J. See an example here.

    package com.kerb4j;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.kerby.kerberos.kerb.client.KrbConfig;
    import org.apache.kerby.kerberos.kerb.server.SimpleKdcServer;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.BeforeEach;
    
    import java.io.File;
    
    public class KerberosSecurityTestcase {
    
        private static final Log log = LogFactory.getLog(KerberosSecurityTestcase.class);
        private static int i = 10000;
        protected int kdcPort;
        private SimpleKdcServer kdc;
        private File workDir;
        private KrbConfig conf;
    
        @BeforeAll
        public static void debugKerberos() {
            System.setProperty("sun.security.krb5.debug", "true");
        }
    
        @BeforeEach
        public void startMiniKdc() throws Exception {
    
            kdcPort = i++;
    
            createTestDir();
            createMiniKdcConf();
    
            log.info("Starting Simple KDC server on port " + kdcPort);
    
            kdc = new SimpleKdcServer(workDir, conf);
            kdc.setKdcPort(kdcPort);
            kdc.setAllowUdp(false);
            kdc.init();
            kdc.start();
        }
    
        @AfterEach
        public void stopMiniKdc() throws Exception {
            log.info("Stopping Simple KDC server on port " + kdcPort);
            if (kdc != null) {
                kdc.stop();
                log.info("Stopped Simple KDC server on port " + kdcPort);
            }
        }
    
        public void createTestDir() {
            workDir = new File(System.getProperty("test.dir", "target"));
        }
    
        public void createMiniKdcConf() {
            conf = new KrbConfig();
        }
    
        public SimpleKdcServer getKdc() {
            return kdc;
        }
    
        public File getWorkDir() {
            return workDir;
        }
    
        public KrbConfig getConf() {
            return conf;
        }
    
    }
    

    Disclaimer: I'm the author of Kerb4J