Demo of keycloak & mysql in docker

安裝 & 啓動Docker環境

下載keycloak鏡像

docker pull jboss/keycloakhtml

下載Mysql鏡像

注意這裏若是直接用 latest 會下載到 mysql8 鏡像,mysql8和最新版的keycloak集成會報一個「MySQLSyntaxErrorException: Row size too large」的錯誤,詳情請見 這裏 。所以指定 mysql 5.7 版本:java

docker pull mysql:5.7mysql

建立網絡環境

docker network create key-cloakgit

啓動Mysql實例

docker run --name mysql -d --net keycloak-network -e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=password -e MYSQL_ROOT_PASSWORD=root_password mysql:5.7github

啓動Keycloak

docker run --name keycloak -d -p 443:443 -p 8080:8080 -p 9990:9990 --net keycloak-network jboss/keycloakspring

配置Keycloak

容許局域網IP訪問

docker exec -it keycloak bashsql

vi keycloak/standalone/configuration/standalone.xmldocker

在 interfaces 節點添加 any 子節點,並將socket-binding-group的默認interface改成 any:springboot

<interfaces>
    <interface name="management">
        <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
    </interface>
    <interface name="public">
        <inet-address value="${jboss.bind.address:127.0.0.1}"/>
    </interface>
    <interface name="any">
        <any-ipv4-address/>
    </interface>
</interfaces>
<socket-binding-group name="standard-sockets" default-interface="any" port- 
   offset="${jboss.socket.binding.port-offset:0}">
    ……
</socket-binding-group>

增長admin帳號

./keycloak/bin/add-user-keycloak.sh -r master -u landas -p …bash

記得重啓容器使得配置生效!

驗證身份並關閉SSL

./keycloak/bin/kcadm.sh config credentials --server http://localhost:8080/auth --realm master --user landas

./keycloak/bin/kcadm.sh update realms/master -s sslRequired=NONE

設置User、Client、Resource

使用剛設置的 admin 帳號登陸控制檯 http://${虛擬機IP}:8080

依次建立Realm/Clients/Role/User,詳細步驟參見 這裏。注意在client中要正確填寫後面Java項目實際運行的機器局域網IP。

建立須要受權的項目

簡單起見,直接用springboot,在建工程的時候勾選 themeleaf 及 keycloak。 build.gradle文件以下:

buildscript {
    ext {
        springBootVersion = '2.0.6.RELEASE'
    }
    repositories {
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.landas'
version = '1.0'
sourceCompatibility = 1.8

repositories {
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
}


ext {
    keycloakVersion = '4.5.0.Final'
}

dependencies {
    implementation('org.keycloak:keycloak-spring-boot-starter')
    implementation('org.springframework.boot:spring-boot-starter-thymeleaf')
    implementation('com.google.guava:guava:19.0')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
    imports {
        mavenBom "org.keycloak.bom:keycloak-adapter-bom:${keycloakVersion}"
    }
}

項目的application.properties配置以下,其中192.128.192.128是虛擬機局域網IP。realm、resource、role 都是上面步驟中在keycloak控制檯配置的名稱,patterns是須要使用keycloak受權的接口URL:

keycloak.auth-server-url=http://192.168.192.128:8080/auth
keycloak.realm=keycloak_test
keycloak.resource=keycloak_testclient_1
keycloak.public-client=true

keycloak.security-constraints[0].authRoles[0]=keycloak_test_role1
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

Controller主要方法以下:

@GetMapping(path = "/")
public String index() {
    return "external";
}

@GetMapping(path = "/customers")
public String customers(Principal principal, Model model) {
    model.addAttribute("customers", generateCustomers());
    model.addAttribute("username", principal.getName());
    return "customers";
}

最後在resources下建template文件夾,放入 customers.html/external.html/layout.html 三個文件

啓動項目,登陸 http://{ip}:{port},登入external。注意這裏的 ip 不能使localhost,而必須是項目運行機器的局域網IP,keycloak將用此 IP 重定向。

點擊customers連接,輸入用戶名密碼,可見customers頁面已經過 keycloak 驗證。

DEMO 至此成功完成。

備註:項目啓動前記得將虛擬機時區設置爲中國區(CST),並使用ntpupdate同步時間,不然可能會報invalid token錯誤。具體錯誤請見 keycloak-user 郵件列表

相關文章
相關標籤/搜索