Od jakiegoś czasu bawię się po pracy Kotlinem, a dzisiaj postanowiłem zamiast Springa spróbować Ktora. Wyklikałem parę rzeczy z GUI IntelliJ i gotowe, prosta aplikacja z REST API i zalążkiem security działa i odpala się w mniej niż sekundę. No ale trzeba to security zaimplementować, chociaż jakieś JWT niech tam się waliduje. Od razu przypomniałem sobie swoje pierwsze zmagania z konfiguracją JWT w Springu, tutaj brakło adnotacji, tutaj stringly typed path albo rola ma literówkę, a pod koniec okazuje się że jeden z 15 interfejsów które kazali Ci zaimplementować w tutorialu jest już deprecated. Ale po całym dniu w końcu jest, nawalone wszędzie niezrozumiałych konfiguracji i adnotacji i oczywiście strach to ruszyć, ale działa.
Trochę zniechęcony tą wizją zacząłem wertować dokumentacje i materiał dotyczące zrobienia tego samego w Ktorze... jak się zdziwiłem jak 15 minut później wszystko działało, a faktyczne linijki kodu potrzebne do konfiguracji security i zabezpieczenia endpointu mogę policzyć na palcach jednej ręki, pomijając oczywiście implementacje samego tworzenia / walidacji tokena, która nie leży po stronie Springa / Ktora.
install(Authentication) {
jwt {
verifier(jwtConfig.verifier)
validate {
it.payload.getClaim("username").asString()?.let(userRepository::find)
}
}
}
routing {
authenticate {
get("/protected") {
call.respond("hello from protected api")
}
}
}
Może mam obecnie nieco więcej doświadczenia niż gdy pierwszy raz podchodziłem do tematu w Springu, aczkolwiek różnice w skomplikowaniu czy też ilości boilerplate kodu widać gołym okiem, dla porównania pierwszy lepszy tutorial z serii "spring jwt auth" https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/.
Well done JetBrains.
Do programowania w Java szybko (12 msc+) się zniechęciłem. To nadal język programowania, czy adnotowania, frameowrkowania i monadowania?
@Shalom: tak jak pisałem, to pierwszy lepszy tutorial z Googla, aczkolwiek z tego co pamiętam to ciężko znaleźć było coś lepszego, przynajmniej wtedy gdy podchodziłem pierwszy raz do tematu. No i nie zmienia to faktu, że w Twoim przykładzie path jest stringly typed i jak nie dopiszesz @EnableWebSecurity
to nic nie zadziała. Aczkolwiek nie chce się upierać, że Spring zły a Ktor super, po prostu póki co jestem mocno pozytywnie zaskoczony tym drugim ;)
@Aleksander32 W sumie do monad nie mam pretensji (rozpędziłem się za nadto, sorki). Ciekaw jestem ilu programistów Java wie co robi to 'and()' po czwartej kropce.
@Aleksander32: To and() dotyczy czego?
-> któż to moze wiedzieć? ;) A tak poważnie to Spring Security robi całą konfiguracje jako jeden wielki fluent builder, w efekcie część operacji "wchodzi" niżej pozwalając cośtam konfigurować i te and()
są żeby wyskoczyć wyżej. Ale widzę że w sumie dorobili sie też bardziej ludzkiego API, więc można to też napisać bardziej czytelnie:
http
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
.authorizeRequests(authorizeRequests -> authorizeRequests
.antMatchers("/protected/**")
.authenticated()
);
@urke: e tam zaraz strach, rzeczywistość. Niedawno zostałem zbesztany za to, że raczyłem skrytykować gościa który przyznał, że nie dotknął żadnej dokumentacji przez 4 lata i leci na stacku i medium.com.
@RequiredNickname: jeśli to co robi działa dobrze, to chyba tym lepiej dla technologii, ze starczy jej używać a nie trzeba się przebijać przez tony dokumentacji
@danek: są dwie szkoły: jedna która mówi, że wystarczy bezmyślnie kopiować i może zadziała, druga która mówi, że warto poznać narzędzia których się używa by się choć trochę odróżnić od małp klepiących w klawiaturę i by w razie problemów wiedzieć jak sobie z nimi poradzić (np. problemy wydajnościowe w hibernate czy kwestia używania setów zamiast list w encjach).
@RequiredNickname: a można po prostu mieć dobre api, nie mieć przeciekających abstrakcji i wtedy nie trzeba czytać tysiąc tonowych bibli do Hibernate. Czemu jak korzystam z Jooq albo JdbcTemplate nie mam takich problemów?
@Aleksander32: nie masz problemów z hibernate bo nie korzystasz z hibernate? Życie to nie koncert życzeń, wrzucą Cię do projektu, gdzie jest orm i tupanie nogami nie pomoże. Wrzucą Ci taska na zafiksowanie problemów z kolejnością elementów w liście zawartej w encji i będą oczekiwać naprawy błędu. Hibernate to tylko przykład, do dokumentacji Jooq też nie zajrzałeś tylko czytałeś tutoriale na medium autorstwa jakiegoś Hindusa(nie, żebym coś miał do Hindusów)?
@RequiredNickname: ja tylko stwierdzam fakt, że czym więcej kod jest zrozumiały tym lepiej i czym bardziej człowieka pilnuje kompilator tym lepiej. Jak masz kompilowany kod i normalną kompozycję to widzisz kod i rozumiesz, a jak masz milion adnotacji to musisz czytac i pamiętać biblie. No słabe to
ShalomNie chce cię martwić ale na oko to wziąłeś jakis chory tutorial :D W praktyce Springowa konfiguracja wyglądałaby tak:
Plus jedno property
spring.security.oauth2.resourceserver.jwt.jwk-set-uri
które ma URL do klucza publicznego do weryfikacji tokenów.