Параметр 1 конструктора требует bean-компонента типа, который не может быть найден

Я застрял на некоторое время. Я изменяю свой проект Spring Security, добавляя Jwt. В настоящее время я пытаюсь заставить JwtEncoder и JwtDecoder работать в SecurityConfig, для этих методов мне нужны RSAPrivateKey и RSAPublicKey. Чтобы получить эти значения ключей, я использую запись с аннотацией @ConfigurationProperties. Но получение этой записи в SecurtyConfig вызывает у меня некоторые проблемы:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in com.ssl.app.security.config.SecurityConfig required a bean of type 'com.ssl.app.security.config.RsaKeyProperties' that could not be found.


Action:

Consider defining a bean of type 'com.ssl.app.security.config.RsaKeyProperties' in your configuration.

Это мой SecurtyConfig

import com.nimbusds.jose.jwk.JWK;
import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.source.ImmutableJWKSet;
import com.nimbusds.jose.jwk.source.JWKSource;
import com.nimbusds.jose.proc.SecurityContext;
import com.ssl.app.security.filters.LoginAuthFilter;
import com.ssl.app.utility.ConsoleUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtEncoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;



@Configuration
//@AllArgsConstructor
@EnableWebSecurity
//@EnableConfigurationProperties
public class SecurityConfig {
    private final LoginAuthFilter loginAuthFilter;
    private final RsaKeyProperties rsaKeyProperties;



    public SecurityConfig(LoginAuthFilter loginAuthFilter, RsaKeyProperties rsaKeyProperties) {
        this.loginAuthFilter = loginAuthFilter;
        this.rsaKeyProperties = rsaKeyProperties;
    }



    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .csrf(csrf -> csrf.disable())
                .authorizeRequests(auth -> auth
                        .anyRequest().authenticated()
                )
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt) // get config_class :: method
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .addFilterBefore(loginAuthFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }



    @Bean
    JwtDecoder jwtDecoder() {
        ConsoleUtil.PrintRow(this.getClass().getSimpleName(),"Decode publicKey", "true");
        // Get public key and decode and return
        return NimbusJwtDecoder.withPublicKey(rsaKeyProperties.publicKey()).build();

    }



    @Bean
    JwtEncoder jwtEncoder() {
        ConsoleUtil.PrintRow(this.getClass().getSimpleName(),"Encode jwt", true);

        JWK jwk = new RSAKey.Builder(rsaKeyProperties.publicKey()).privateKey(rsaKeyProperties.privateKey()).build();
        JWKSource<SecurityContext> jwks = new ImmutableJWKSet<>(new JWKSet(jwk));
        return new NimbusJwtEncoder(jwks);
    }

}

Записывать

import org.springframework.boot.context.properties.ConfigurationProperties;

import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

@ConfigurationProperties(prefix  = "rsa")
public record RsaKeyProperties(RSAPublicKey publicKey, RSAPrivateKey privateKey) {
}

Я попытался добавить @EnableConfigurationProperties и EnableAutoConfiguration в SecurtyConfig, но это не дало никакого эффекта. Аннотация @Value тоже не работает. SecurityConfig требовался bean-компонент, но какой bean-компонент?

Вы добавили @EnableConfigurationProperties(RsaKeyProperties.class) или просто пустое @EnableConfigurationProperties. Добавление @EnableAutoConfiguration ничего не изменит, так как это следует из @SpringBootApplication.

M. Deinum 29.11.2022 10:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
1
365
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, вам стоит обратиться к этой статье весна-безопасность-jwt

Другие вопросы по теме