docker pull jboss/keycloakhtml
注意这里若是直接用 latest 会下载到 mysql8 镜像,mysql8和最新版的keycloak集成会报一个“MySQLSyntaxErrorException: Row size too large”的错误,详情请见 这里 。所以指定 mysql 5.7 版本:java
docker pull mysql:5.7mysql
docker network create key-cloakgit
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
docker run --name keycloak -d -p 443:443 -p 8080:8080 -p 9990:9990 --net keycloak-network jboss/keycloakspring
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>
./keycloak/bin/add-user-keycloak.sh -r master -u landas -p …bash
记得重启容器使得配置生效!
./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
使用刚设置的 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 邮件列表。