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

Změna portu Redisu

Konfigurační soubor Redisu redis.conf lze na Linuxu najít ve složce /etc/redis. V tomto souboru je definován také port, na kterém Redis běží:

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

Ve výchozím nastavení se používá port 6379. Pokud port změníte, je třeba restartovat redis server.

sudo service redis-server restart

Připojení můžete vyzkoušet pomocí redis-cli.

redis-cli ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused

Pokud východí port 6379 změníte, musíte redis-cli říct, na který port se má připojit (přepínač -p). V tomto případě jsem port změnil na 6378.

redis-cli -p 6378 ping
PONG

VPN v Mintu

Linux Mint obsahuje open-source OpenVPN. Pokud byste jej nainstalovaný neměli, instalace probíhá klasicky

sudo apt-get install openvpn

Nejjednodušší zprovoznění VPN je, pokud máte (někdo vám pošle) konfigurační soubor (přípona .ovpn). Pak stačí zadat

openvpn --config soubor.ovpn

a jste připojeni. Ukázkový .ovpn soubor naleznete zde. Další užitečné příkazy

openvpn --version
openvpn --help

 

PostgreSQL v Dockeru

Chcete si vyzkoušet PostgreSQL, ale nechcete si jej instalovat? Řešením je použít Docker. Zde je jednoduchý postup, jak PostgreSQL v Dockeru spustit a připojit se.

docker pull postgres

Stáhne si image postgresu z úložiště (repozitory).

docker image ls

Zobrazí seznam stažených images.

docker ps

Zobrazí seznam aktuálně běžících kontejnerů.

docker run --rm --name my-postgres -e POSTGRES_PASSWORD=password -d -p 2345:5432 postgres

docker run spustí proces v novém kontejneru
-e nastaví proměnnou prostředí (v totmo případě heslo)
-p prováže veřejný port (nastaven na 2345) s portem postgresu (5432) hostPort:containerPort
-d detached mode (spustí kontejner na pozadí a zobrazí id kontejneru)
--rm automaticky odstraní kontejner pokud existuje
--name přiřadí kontejneru jméno

psql -h localhost -p 2345 -U postgres -d postgres

Připojí se k PostgreSQL databázi.