Search code examples
authenticationkotlinmicronaut

Class 'AuthenticationProviderUserPassword' does not implement abstract member public abstract fun authenticate


I am stuck in user authentication with micronaut application authenticate function not accepting httpRequest param

I'm getting an error

Class 'AuthenticationProviderUserPassword' is not abstract and does not implement abstract member public abstract fun authenticate(authenticationRequest: AuthenticationRequest<(raw) Any!, (raw) Any!>!): Publisher! defined in io.micronaut.security.authentication.Authenticatio

Service:

package example.micronaut.services

import io.micronaut.http.HttpRequest
import io.micronaut.security.authentication.AuthenticationFailed
import io.micronaut.security.authentication.AuthenticationProvider
import io.micronaut.security.authentication.AuthenticationRequest
import io.micronaut.security.authentication.AuthenticationResponse
import io.micronaut.security.authentication.UserDetails
import io.reactivex.Flowable
import org.reactivestreams.Publisher
import java.util.*
import javax.inject.Singleton

@Singleton // <1>
class AuthenticationProviderUserPassword : AuthenticationProvider { // <2>

    override fun authenticate(httpRequest: HttpRequest<*>?, authenticationRequest: AuthenticationRequest<*, *>?): Publisher<AuthenticationResponse> {
        if (authenticationRequest != null && authenticationRequest.identity != null && authenticationRequest.secret != null) {
            if (authenticationRequest.identity == "sherlock" && authenticationRequest.secret == "password") {
                return Flowable.just<AuthenticationResponse>(UserDetails(authenticationRequest.identity as String, ArrayList()))
            }
        }
        return Flowable.just<AuthenticationResponse>(AuthenticationFailed())
    }
}

My build.gradle

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.3.50"
    id "org.jetbrains.kotlin.kapt" version "1.3.50"
    id "org.jetbrains.kotlin.plugin.allopen" version "1.3.50"
    id "com.github.johnrengelman.shadow" version "5.2.0"
    id "application"
}

version "0.1"
group "example.micronaut"

repositories {
    mavenCentral()
    maven { url "https://jcenter.bintray.com" }
}

configurations {
    // for dependencies that are needed for development only
    developmentOnly
}

dependencies {
    implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}"
    implementation "org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}"
    implementation "io.micronaut:micronaut-runtime"
    implementation "javax.annotation:javax.annotation-api"
    implementation "io.micronaut:micronaut-http-server-netty"
    implementation "io.micronaut:micronaut-http-client"

    implementation "io.micronaut:micronaut-security-session"

    kapt platform("io.micronaut:micronaut-bom:$micronautVersion")
    kapt "io.micronaut:micronaut-inject-java"
    kapt "io.micronaut:micronaut-validation"
    kaptTest platform("io.micronaut:micronaut-bom:$micronautVersion")
    kaptTest "io.micronaut:micronaut-inject-java"
    runtimeOnly "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8"
    runtimeOnly "ch.qos.logback:logback-classic:1.2.3"
    testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion")
    testImplementation "io.micronaut.test:micronaut-test-kotlintest"
    testImplementation "io.mockk:mockk:1.9.3"
    testImplementation "io.kotlintest:kotlintest-runner-junit5:3.3.2"
    implementation 'junit:junit:4.12'

    compile "io.micronaut.configuration:micronaut-hibernate-jpa"
    compile "io.micronaut.configuration:micronaut-hibernate-validator"
    compileOnly "jakarta.persistence:jakarta.persistence-api:2.2.2"

    annotationProcessor "io.micronaut.data:micronaut-data-processor:1.0.2"
    runtime "com.h2database:h2"
    runtime "io.micronaut.configuration:micronaut-jdbc-tomcat"

}

test.classpath += configurations.developmentOnly

mainClassName = "example.micronaut.Application"

test {
    useJUnitPlatform()
}

allOpen {
    annotation("io.micronaut.aop.Around")
}

compileKotlin {
    kotlinOptions {
        jvmTarget = '1.8'
        //Will retain parameter names for Java reflection
        javaParameters = true
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = '1.8'
        javaParameters = true
    }
}

shadowJar {
    mergeServiceFiles()
}

tasks.withType(JavaExec) {
    classpath += configurations.developmentOnly
    jvmArgs('-noverify', '-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote')
}


Solution

  • The docs you are looking at are compatible with more recent versions of the interface than you are using. You appear to be using the one at https://github.com/micronaut-projects/micronaut-security/blob/78169cb6927d10dcc6ebc2f6ecb96efb26b9585b/security/src/main/java/io/micronaut/security/authentication/AuthenticationProvider.java#L39 which is why your code won't compile. 2.0RC1 looks like https://github.com/micronaut-projects/micronaut-security/blob/d5ecfc200cf27bd92ec7ce7b3760f5c264ec2647/security/src/main/java/io/micronaut/security/authentication/AuthenticationProvider.java#L44.