Authentifizieren mit SpringBoot

Ray B

Mitglied
Hallo zusammen,

ich habe eine Anwendung die ich über das Nezwerk anspreche. Ich Nutze dafür Feign / SpringBoot.

Code:
import feign.auth.BasicAuthRequestInterceptor;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class FeignClientConfiguration  {

  public String user = "user";
  public String password = "Passwort";

    @Bean({"mybean"})
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor(user, password );
    }

Diese Klasse binde ich im Code ein. zB:
Code:
@Component
@FeignClient(name="service", configuration = FeignClientConfiguration.class, url = "http:/usethatservice:8080/web/rest/json/article")

public interface PricingService {
    @PostMapping(path = "/{beliebigerName}/pricing")
    AllPricingSteps postSomething(@PathVariable("beliebigerName") Integer numb);
}

Und soweit funktioniert das dann auch. Wenn ich aber zur Laufzeit mit einem anderen User den Service nutzen will, dann klappt das nicht mehr. Die neuen Werte für user und Passwort werden schlicht ignoriert.
Ist ja auch soweit klar. Der Client authentifiziert sich beim Start des Programms und nicht mehr später. Ich möchte aber mit verschiedenen Usern den service nutzen können und weis nicht wie ich die Credentials zur Laufzeit setzten kann.

Weist jemand was ich zu tun habe ?

Besten Dank
Ray

(P.S. Ich habe die Anfrage so ähnlich schon mal gestellt, aber keine Antwort erhalten. Hoffe mein Problem wird jetzt deutlicher)
 

dzim

Top Contributor
Hast du denn überhaupt die Security Config durchgeführt? Und spring-boot-security hinzugefügt?
Ich kenne Feign jetzt nicht wirklich, aber habe schon ein paar mal Security verwendet...

Java:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
                // explicitly define, that we are not using any role prefix
                .rolePrefix("")
                // set the datasource
                .dataSource(dataSource)
                // set the query to fetch all users
                .usersByUsernameQuery(GET_USER)
                .authoritiesByUsernameQuery(GET_ROLE)
                // Custom: Klasse, die org.springframework.security.crypto.password.PasswordEncoder implementiert
                .passwordEncoder(encoder);
    }

    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // hier wird festgelegt, wie du einloggst (z.B. Basic) und auf welchen Pfaden wer Zugriff hat
        // @EnableGlobalMethodSecurity(prePostEnabled = true) -> erlaubt aber auch @PreAuthorize("hasAuthority('basic')") an einzelnen Methoden, damit bleibt die SecurityConfig relativ kompakt
    }
}

Wie jetzt Feign als Http-Client (verstehe ich das richtig?) da ins Bild passt, weiss ich leider nicht.
 

Ray B

Mitglied
Hi dzim,

danke für die Antwort.

Ja, Feign ist der HTTP-Client. Die Security-Config sollte eigentlich Feign übernehmen.
Falls ich aber bei meiner Recherche auf keine Lösung komm, werde ich wohl Feign rausschmeissen und nur SpringBoot verwenden.
Da hätte ich dann wieder Fragen über Fragen :)
 

dzim

Top Contributor
Also wenn du "nur" einen Http-Client innerhalb deiner Spring-Boot-Anwendung benötigst, kannst du auch Springs RestTemplates oder Retrofit (und OkHttp) verwenden. Aber wie gesagt: Ich kenne Feign zu wenig, um genauer etwas dazu sagen zu können. Von einer kurzen Recherche (und Tutorial auf Baeldung) würde ich sagen, dass er Retrofit recht ähnlich sieht.
Was mich dazu bringt, dass ich dich eventuelle auch einfach falsch verstanden habe!

Kann es sein, dass nicht Security benötigst um deinen Service abzudichten (was mein Code und Vorschlag im Grunde war) sondern du willst "nur" wissen, wie dein Client Http-Header ("Authentication: Basic <base64[user:password]>") injizieren kann. Mit Retrofit muss man den OkHttp-Client übergeben und kann dort Interceptoren schreiben. Alternativ kann man Header auch als Parameter an die Deklaration übergeben (also in der Interface-Methode wie @Header oder so). Ich denke, dass könnte bei Feign ähnlich laufen. Dann musst du dir nur einen Service, oder so, schreiben, der dir den Authentication-Header konstruieren kann...

Wenn du dir nur die Beschreibung auf GitHub anschaust, kannst du das wohl recht einfach machen:
https://github.com/OpenFeign/feign -> Suche "Set headers using apis"
Mit
Java:
@RequestLine("POST /doit")
@Headers("Authentication: Basic {auth}")
void postDoit(@Param("auth") String auth); // submit Base64 encoded String with format "<username>:<password>"

Ich vermute mal, dass ist, was du brauchen kannst. Eventuell kannst du aber auch in der API, wenn du den Client anhand der Deklaration generierst, eine Art Authentication-Interceptor oder so angeben. Das machst du oben zwar schon, aber ich denke, du müsstest auch die Erstellung des Feign-Client anpassen. Obwohl die Doku zu Spring Cloud und Feign ja eigentlich es auch nur beschreibt, wie du:
https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html
Nur noch eine Extra-Bean für den "Feign-Contract" ist drin und die application-Properties werden beschrieben. Vielleicht musst du dort mal schauen?
 

Ray B

Mitglied
Das hört sich schon mal sehr interessant an. Ich denke das geht in die richtige Richtung. Muss ich gleich ausprobieren.
Bei
Code:
 @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }
bekomm ich immer einen Fehler. Weis aber (noch) nicht warum.

Danke für die Hilfe. Ich sag hier dann was bei rausgekommen ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Springboot und LDAP - Authentifizieren gegen Gruppe Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Spring Security: Wie den User dynamisch authentifizieren? Frameworks - Spring, Play, Blade, Vaadin & Co 8
ExceptionOfExpectation Persistierung in Hibernate(SpringBoot) Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Desktop-Window in SpringBoot Frameworks - Spring, Play, Blade, Vaadin & Co 12
S java springboot HTML Produktstruktur Frameworks - Spring, Play, Blade, Vaadin & Co 1
G Java springboot Item mit ItemInstance verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation @Value() für application.properties [SpringBoot] Frameworks - Spring, Play, Blade, Vaadin & Co 9
Zrebna SpringBoot: Einfache RestAPI konsumieren gelingt nicht. Frameworks - Spring, Play, Blade, Vaadin & Co 6
Zrebna SpringBoot-Project: java.sql.SQLSyntaxErrorException: Access denied for user 'gap3'@'%' to database '3306/gap3' Frameworks - Spring, Play, Blade, Vaadin & Co 3
D SpringBoot Properties und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 8
Dimax SpringBoot native Querry return ArrayList Frameworks - Spring, Play, Blade, Vaadin & Co 6
OnDemand SpringBoot Logrotation funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 6
Robertop Springboot Server kann Jakarta Persistence Root nicht installieren? Frameworks - Spring, Play, Blade, Vaadin & Co 0
G SpringBoot MVC Frameworks - Spring, Play, Blade, Vaadin & Co 1
tom.j85 SpringBoot Rest-Application funktioniert nicht - Keine Fehlermeldungen Frameworks - Spring, Play, Blade, Vaadin & Co 13
V SpringBoot/Thymeleaf ein Attribut zum Controller schicken Frameworks - Spring, Play, Blade, Vaadin & Co 10
L OpenJFX, SpringBoot und Gradle Frameworks - Spring, Play, Blade, Vaadin & Co 12
L SpringBoot Web Application Frameworks - Spring, Play, Blade, Vaadin & Co 1
S SpringBoot MySQL not run Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Günstigste oder kostenlose Variante SpringBoot Application laufen zu lassen Frameworks - Spring, Play, Blade, Vaadin & Co 7
Z Springboot - Hauptklasse nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 5
A SpringCloud | SpringBoot | Eureka Frameworks - Spring, Play, Blade, Vaadin & Co 0

Ähnliche Java Themen

Neue Themen


Oben