Získání klíčů Redis databáze

Pro získání klíčů v rámci Redisu při použítí redis-cli existuje příkaz KEYS pattern. Pokud chcete všechny klíče použijete KEYS *, pokud pouze klíče začínající na ‚my‘ použijete KEYS my*. Typ hodnoty klíče zjistíte příkazem TYPE nazev-klice.

Dokumentace nedoporučuje používat KEYS v produkční databázi nebo u velkých databází, neboť KEYS vrací všechny klíče a to může mít vliv na výkonnost. Místo KEYS se doporučuje použití SCAN. Scan vrací na každý dotaz jen omezené množství záznamů a požaduje cursor (ukazatel). V rámci odpovědi vrací nalezené klíče a další ukazatel. Dokud není vrácený ukazatel rovný 0, stále existují klíče, které ještě nebyly vráceny. Výchozí nastavení pro scan vrací 10 záznamů. To možné změnit volbou COUNT.

Číst dálZískání klíčů Redis databáze

Informix, Docker a SQuirrel

V tomto příspěvku ukáži, jak se pomocí SQuirrel připojit do Informixu běžícího v Dockeru. Informix je relační databázový systém firmy IBM. Tomu jak jej rozchodit jako docker image jsem se věnoval v předchozím příspěvku. SQuirrel je grafické rozhraní napsané v jazyce Java pro přístup k databázi (databázím). Více o instalaci se dozvíte v tomto příspěvku.

SQuirrel potřebuje pro komunikaci s databází JDBC ovladač. Ten lze stáhnou z maven repozitáře, nebo ze stránek IBM. Ovladač nahrajte do složky ../lib programu SQuirrel. Pokud nyní spustíte SQuirrel, měl by již být informix driver k dispozici.

Číst dálInformix, Docker a SQuirrel

Informix v Dockeru

V tomto příspěvku ukáži rozchození IBM relačního databázového systému Informix v Dockeru.

docker run -it --name ifx --privileged -p 9088:9088 -e LICENSE=accept ibmcom/informix-developer-database:latest

Stáhne image s informixem a vytvoří kontejner s názvem ifx.

-p 9088:9088 vystavení interního portu 9088 ven
-e LICENSE=accept pro používání informixu je třeba souhlasit s licenčními podmínkami
-i interaktivní
-t pseudo terminál

Výstup uvedeného příkazu bude zhruba následující:

Číst dálInformix v Dockeru

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.

Spring OAuth2

Pro vytvoření oauth autorizace nabízí spring knihovnu

org.springframework.security.oauth:spring-security-oauth

Zde najdete celkem 8 endpointů označených anotací @FrameworkEndpoint:

  • /oauth/authorize (class AuthorizationEndpoint)
  • /oauth/authorize, method = RequestMethod.POST, params = OAuth2Utils.USER_OAUTH_APPROVAL (class AuthorizationEndpoint)
  • /oauth/check_token (class CheckTokenEndpoint)
  • /oauth/token, method=RequestMethod.GET (class TokenEndpoint)
  • /oauth/token, method=RequestMethod.POST (class TokenEndpoint)
  • /oauth/token_key, method = RequestMethod.GET (class TokenKeyEndpoint)
  • /oauth/confirm_access (class WhitelabelApprovalEndpoint)
  • /oauth/error (class WhitelabelErrorEndpoint)

Anotace @FrameworkEndpoint znamená, že tyto endpointy jsou vytvořeny frameworkem. Nemusíte je tedy vytvářet sami.

Programujeme v Minecraftu: Nastavení a první projekt

Máte rádi Minecraft? A chcete si jej přizpůsobit? V tomto příspěvku ukáži, jak si nastavit Minecraft tak, abyste v něm mohli „programovat“ a zároveň vytvoříme první jednoduchý projekt. Budete k tomu potřebovat Minecraft for Windows (nebo Minecraft Education Edition). Bohužel v Minecraft Java Version toto nefunguje (pokud jste Minecraft Java Version kupovali před listopadem 2018, je možné, že Minecraft for Windows můžete získat zdarma). Také si stáhněte Code Connection for Minecraft (je zdarma).

Spusťte Minecraft a vytvořte si nový svět, kde povolíte cheatování.

Číst dálProgramujeme v Minecraftu: Nastavení a první projekt

Redis v Dockeru

V nedávném příspěvku jsem se věnoval PostgreSQL v Dockeru. V tomto příspěvku se zaměřím na Redis v Dockeru.

Redis v Dockeru si spustíte příkazem docker run -d -p 6379:6379 --name redis1 redis.

docker run -d -p 6379:6379 --name redis1 redis
Pokud image redis nemáte na svém počítači, provedes se stažení (pull). Zároveň se redis spustí na pozadí
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
bc51dd8edc1b: Pull complete
37d80eb324ee: Pull complete
392b7748dfaf: Pull complete
48df82c3534d: Pull complete
2ec2bb0b4b0e: Pull complete
1302bce0b2cb: Pull complete
Digest: sha256:7b84b346c01e5a8d204a5bb30d4521bcc3a8535bbf90c660b8595fad248eae82
Status: Downloaded newer image for redis:latest
b44ab2740c8349b7bcfbff65f197855f6fd734ece4df71d81830bcb2eb7482a4

Tento výpis uvidíte pouze v případě, že jste zatím redis na svém počítači nikdy nespouštěli. Pokud již image redisu máte, výpis bude výrazně kratší.

Číst dálRedis v Dockeru