软件安装及其下载

安装与下载链接:下载链接
官网下载链接:官网

安装&启动

  • 解压下载下来的安装包
  • 将目录切换到KEYCLOAK_PATH/bin ,其中KEYCLOAK_PATH是您Keycloak的根目录
  • 执行./standalone.sh ,即可启动Keycloak,如需后台运行,则执行./standalone.sh & 。

初始化

启动后,访问http://localhost:8080/ 将会显示类似如图的界面:
在这里插入图片描述
该界面让我们创建一个初始化的admin账户。那么我们不妨填写一下,为了测试方便,我们将账号/密码分别设为peihj/123456 ,然后点击create按钮,将会跳转到如下界面:

Keycloak

realm含义

那Realm是什么意思呢?Realm字面意思是领域,指的是在某一个软件业务领域中所涉及的用户认证授权管理相关的对象,在这个realm下有用户、角色、会话(session)等等用于认证授权管理的对象。假设一个公司A使用一个ERP系统,那么就可以给这个公司A设置一个Realm,用于该公司所有员工的授权管理。那么如果另一个公司B也使用这个ERP系统(假设这个ERP系统是第三方提供给所有公司使用的一个ERP服务,就需要给公司B也创建一个Realm,用于公司B员工的授权管理。所以Realm之间的相互隔离的一个业务领域概念。

创建realm

点击Add Realm
在这里插入图片描述
输入Name,点击Create按钮。我们就创建了一个名为myrealm的realm。
在这里插入图片描述

创建client

创建完realm后,我们来为myrealm创建Client ,点击下图的Create按钮
在这里插入图片描述
填写Client信息,这边我们创建一个名为keycloakDemo的Client。
在这里插入图片描述
在这里插入图片描述

配置Client

点击Client ID或者后面的Edit都可进入Client配置界面

在这里插入图片描述

修改Client配置

在这里插入图片描述

  • public 适用于客户端应用,且需要浏览器登录的场景。典型的使用场景就是前端web系统,包括采用vue、react实现的前端项目等。
  • confidential 适用于服务端应用,且需要浏览器登录以及需要通过密钥获取access
    token的场景。典型的使用场景就是服务端渲染的web系统。
  • bearer-only 适用于服务端应用,不需要浏览器登录,只允许使用bearer token请求的场景。典型的使用场景就是restful-api。
  • 此处我们选择public,其他内容保持默认即可。

创建Role

设置一个名字,然后你就可以给你自己的realm设置各种对象了。比如创建用户,创建一个角色,给用户授予角色等等。例如:我创建一个USER的角色,创建一个testuser01用户,然后给这个用户授予USER角色:

选择左边Role菜单,点击表格右上角的Add Role
在这里,我们添加两个角色,角色名分别为demoUser和notDemoUser。
在这里插入图片描述
在这里插入图片描述

创建User

选择左侧User菜单,选择表格右上角的Add User
在这里,我们创建两个角色demouser和notdemouser
在这里插入图片描述
创建好用户后,选择Credentials,并在下方输入两次密码并把Tempoorary右侧的On点一下改成Off(不改的话首次登陆需要修改密码),给用户添加密码
在这里插入图片描述

分配User的角色

色创建好后,现在就需要将客户端和角色进行关联了。否则用户登录进去后会提示没有权限。创建好用户后进入用户配置界面,选择Role Mappings,并在下方Realm Roles中选择需要添加的角色,并点击Add selected按钮即可添加用户角色。在这里,我们给demouser分配了demoUser角色,给notdemouser分配了notDemoUser角色。角

在这里插入图片描述
这样,我们的角色就创建并且关联成功了。

配置Client和Role映射

1、选择左侧Clients,选择我们的keycloakDemo,进入配置页面
2、选择Scope,将默认的Full Scope Allowed后面的On点击改为Off
3、选择我们分配的角色——demoUser,点击Add selected按钮添加到右侧
4、映射成功

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

springboot

创建一个简单的SpringBoot项目

在这里我们创建一个名为keycloakdemo的web项目

添加依赖

添加依赖管理,引入Keycloak adapter的bom
注意,bom版本需要和keycloak版本一致

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.keycloak.bom</groupId>
      <artifactId>keycloak-adapter-bom</artifactId>
      <version>10.0.1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

添加Keycloak的starter

<dependency>
  <groupId>org.keycloak</groupId>
  <artifactId>keycloak-spring-boot-starter</artifactId>
  <version>10.0.1</version>
</dependency>

完整pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.peihj</groupId>
    <artifactId>keycloakdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>keycloakdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.keycloak.bom</groupId>
                <artifactId>keycloak-adapter-bom</artifactId>
                <version>10.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-spring-boot-starter</artifactId>
            <version>10.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.peihj.keycloakdemo.KeycloakdemoApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

package com.peihj.keycloakdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class KeycloakdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(KeycloakdemoApplication.class, args);
    }
}
@RestController
@RequestMapping("/demo")
class DemoController{
    @GetMapping("getValue")
    public String getValue(){
        return "Hello Keycloak!";
    }
}


开始测试

1、启动项目
2、输入http://localhost:8600/demo/getValue,会跳转到keycloak登陆页面
在这里插入图片描述
用demouser登陆,页面显示如下:
在这里插入图片描述
在这里插入图片描述
4、用notdemouser登陆,页面显示如下
在这里插入图片描述

集成Keycloak

在这里插入图片描述
假设我们有两个web服务器,我们需要使用keycloak来对我们的资源进行保护,只有用户登录以后才能访问到这两个服务器的资源,否则就要跳转到登录页面。所以我们要在两个服务之前加一个gateway层,在这一层对用户请求进行拦截,验证用户是否已经登录,如果没有的话,就要引导用户去到keycloak登录页面,认证以后再跳转回到要访问的页面。

因此,我们已经启动了keycloak服务器,缺少的是怎么将拦截用户请求并验证accessToken这些逻辑加入到我们的应用中。keycloak官方给我们提供了这些库,它把这个东西叫做adaptor(connector),所以我们只要将这些库安装到我们的项目中就可以为我们的应用实现认证授权。

在这里插入图片描述

在方法中获得身份、角色等信息

很多场景下,我们希望在Controller中获得当前用户的主体信息,例如获取当前登录的用户名、角色等信息。此时该怎么办呢?

在这里插入图片描述

package com.peihj.keycloakdemo.controller;

import lombok.extern.slf4j.Slf4j;
import org.keycloak.KeycloakPrincipal;
import org.keycloak.representations.AccessToken;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;
import java.util.HashMap;
import java.util.Set;

@RestController
@RequestMapping("/demo")
@Slf4j
public class DemoController {

    @GetMapping("/getValue")
    public HashMap<Object, Object> search(Principal principal) {
        if (principal instanceof KeycloakPrincipal) {
            AccessToken accessToken = ((KeycloakPrincipal) principal).getKeycloakSecurityContext().getToken();
            String preferredUsername = accessToken.getPreferredUsername();
            AccessToken.Access realmAccess = accessToken.getRealmAccess();
            Set<String> roles = realmAccess.getRoles();
            log.info("当前登录用户:{}, 角色:{}", preferredUsername, roles);
        }
        return null;
    }
}

这样,当该方法被请求时,就会打印类似如下的日志:
在这里插入图片描述

注销

只需执行HttpServletRequest.logout() 方法即可注销。
示例代码:

package com.peihj.keycloakdemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

@RestController
public class LogoutController {
    @GetMapping("/logout")
    public String logout(HttpServletRequest request) throws ServletException {
        request.logout();
        return "退出成功";
    }
}

参考

https://blog.csdn.net/m0_46267097/article/details/106123775
https://blog.csdn.net/q64261750/article/details/108263280
https://blog.csdn.net/m0_46267097/article/details/106092404
https://blog.csdn.net/little_kelvin/article/details/111239241
https://blog.csdn.net/wjssbp/article/details/125728131

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐