Zobrazení závislostí v Gradle

Pro zobrazení závislostí v Gradle ve stromové struktuře použijte taks dependencies.

./gradlew dependencies
compileClasspath - Compile classpath for compilation 'main' (target  (jvm)).
+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.1.9.RELEASE
|    +--- org.springframework.boot:spring-boot-starter-aop:2.1.9.RELEASE
|    |    +--- org.springframework.boot:spring-boot-starter:2.1.9.RELEASE
|    |    |    +--- org.springframework.boot:spring-boot:2.1.9.RELEASE
|    |    |    |    +--- org.springframework:spring-core:5.1.10.RELEASE
|    |    |    |    |    \--- org.springframework:spring-jcl:5.1.10.RELEASE
|    |    |    |    \--- org.springframework:spring-context:5.1.10.RELEASE
|    |    |    |         +--- org.springframework:spring-aop:5.1.10.RELEASE
|    |    |    |         |    +--- org.springframework:spring-beans:5.1.10.RELEASE
|    |    |    |         |    |    \--- org.springframework:spring-core:5.1.10.RELEASE (*)
|    |    |    |         |    \--- org.springframework:spring-core:5.1.10.RELEASE (*)
|    |    |    |         +--- org.springframework:spring-beans:5.1.10.RELEASE (*)
|    |    |    |         +--- org.springframework:spring-core:5.1.10.RELEASE (*)
|    |    |    |         \--- org.springframework:spring-expression:5.1.10.RELEASE
|    |    |    |              \--- org.springframework:spring-core:5.1.10.RELEASE (*)
|    |    |    +--- org.springframework.boot:spring-boot-autoconfigure:2.1.9.RELEASE
|    |    |    |    \--- org.springframework.boot:spring-boot:2.1.9.RELEASE (*)
|    |    |    +--- org.springframework.boot:spring-boot-starter-logging:2.1.9.RELEASE
|    |    |    |    +--- ch.qos.logback:logback-classic:1.2.3
|    |    |    |    |    +--- ch.qos.logback:logback-core:1.2.3
|    |    |    |    |    \--- org.slf4j:slf4j-api:1.7.25 -> 1.7.28
|    |    |    |    +--- org.apache.logging.log4j:log4j-to-slf4j:2.11.2
|    |    |    |    |    +--- org.slf4j:slf4j-api:1.7.25 -> 1.7.28
|    |    |    |    |    \--- org.apache.logging.log4j:log4j-api:2.11.2
|    |    |    |    \--- org.slf4j:jul-to-slf4j:1.7.28
|    |    |    |         \--- org.slf4j:slf4j-api:1.7.28
|    |    |    +--- javax.annotation:javax.annotation-api:1.3.2
|    |    |    \--- org.springframework:spring-core:5.1.10.RELEASE (*)
|    |    +--- org.springframework:spring-aop:5.1.10.RELEASE (*)
|    |    \--- org.aspectj:aspectjweaver:1.9.4
|    +--- org.springframework.boot:spring-boot-starter-jdbc:2.1.9.RELEASE
|    |    +--- org.springframework.boot:spring-boot-starter:2.1.9.RELEASE (*)
|    |    +--- com.zaxxer:HikariCP:3.2.0
|    |    |    \--- org.slf4j:slf4j-api:1.7.25 -> 1.7.28
|    |    \--- org.springframework:spring-jdbc:5.1.10.RELEASE
|    |         +--- org.springframework:spring-beans:5.1.10.RELEASE (*)
|    |         +--- org.springframework:spring-core:5.1.10.RELEASE (*)
|    |         \--- org.springframework:spring-tx:5.1.10.RELEASE
|    |              +--- org.springframework:spring-beans:5.1.10.RELEASE (*)
|    |              \--- org.springframework:spring-core:5.1.10.RELEASE (*)

Datové typy Redisu

Redis podporuje 5 datových typů.

  • Strings (textové řetězce) – posloupnost bytů
  • Hashes (heše) – kolekce hodnot klíč-hodnota
  • Lists (seznamy) – seznamy řetězců seřazené podle pořadí vložení
  • Sets (množiny) – neseřazená kolekce řetězců, každý řetězec je jedinečný
  • Sorted Sets (seřazená množina) – seřazená, neopakující se kolekce řetězců

Strings

127.0.0.1:6379> set string-key-1 "string-value-1"
OK
127.0.0.1:6379> set string-key-2 "string-value-2"
OK
127.0.0.1:6379> get string-key-1
"string-value-1"

Číst dálDatové typy Redisu

Zakázání basic auth pro některé endpointy ve Spring OAuth2

To, že Spring OAuth2 řadu endpointů generuje, jsem se zmínil v jednom z předchozích příspěvků. Na jednu stranu je to výhoda, protože většinu věcí máte hotovou, na stranu druhou to může v některých případech být problém. Například můžete chtít, aby endpoint PUT /oauth/token neměl authentikaci. Normálně byste napsali něco následujícího:

override fun configure(http: HttpSecurity) {
    http
            .authorizeRequests()
            .antMatchers(HttpMethod.PUT, "/oauth/token").permitAll()
            .anyRequest().denyAll()
            .and().csrf().disable()
            .formLogin().disable()
}

To ale v tomto případě nestačí, protože request zachytí AuthorizationServerSecurityConfiguration. Ta má nastavený @Order na 0. Řešením je, ve třídě která dědí od WebSecurityConfigurerAdapter nastavit @Order na -1 (@Order(-1)) a přetížit metodu configure následujícím způsobem.

override fun configure(http: HttpSecurity) {
    http
            .requestMatchers()
            .antMatchers(HttpMethod.PUT, "/oauth/token")
            .and().authorizeRequests().anyRequest().permitAll()
            .and().csrf().disable()
            .formLogin().disable()
}

Nezapomeňte na csfr().disable(), jinak budete dostávat 403.

OAuth2

V rámci OAuth2 existují čtyři základní entity:

  • resource owner (uživatel) – vlastník dat
  • resource server (služba) – tam, kde jsou uložena vlastníkova data
  • authorization server (autorizační server) – server, který vydává přistupový token (access token)
  • client application (klientská aplikace) – aplikace, která přistupuje k datům vlastníka (uživatele)

Průběh získání přístupu pro klientskou aplikaci

Klientská aplikace (KA) požádá autorizační server (AS) o přístupový token, kterým se bude následně prokazovat na resource serveru (RS). AS musí ověřit, že uživatel je srozuměn a dává souhlas. To probíhá tak, že KA přesměruje uživatele na AS, kde se uživateli zobrazí přihlášení.

Pokud uživatel zadá správná data, pošle AS na KA přístupový token. KA pak pošle požadavek na RS a přiloží v žádosti tento přístupový token. RS tento token pošle na AS k ověření. AS v odpovědi vrací, zda je token platný a jaká oprávnění se k tomuto token vztahují. To znamená, co vše má KA povoleno.

Pokud je vše v pořádku a KA žádá o data, která má od uživatele povoleny, RS vrací požadovaná data.


Hledáte jednoduché a popisné vysvětlení jak funguje OAuth2? K tomuto tématu jsem narazil na tento příspěvek.

Hezké vysvětlení v češtině (ale bez obrázků) naleznete na stránkách ČVUT.