安装与下载链接:下载链接
官网下载链接:官网
启动后,访问http://localhost:8080/ 将会显示类似如图的界面:
该界面让我们创建一个初始化的admin账户。那么我们不妨填写一下,为了测试方便,我们将账号/密码分别设为peihj/123456 ,然后点击create按钮,将会跳转到如下界面:
那Realm是什么意思呢?Realm字面意思是领域,指的是在某一个软件业务领域中所涉及的用户认证授权管理相关的对象,在这个realm下有用户、角色、会话(session)等等用于认证授权管理的对象。假设一个公司A使用一个ERP系统,那么就可以给这个公司A设置一个Realm,用于该公司所有员工的授权管理。那么如果另一个公司B也使用这个ERP系统(假设这个ERP系统是第三方提供给所有公司使用的一个ERP服务,就需要给公司B也创建一个Realm,用于公司B员工的授权管理。所以Realm之间的相互隔离的一个业务领域概念。
点击Add Realm
输入Name,点击Create按钮。我们就创建了一个名为myrealm的realm。
创建完realm后,我们来为myrealm创建Client ,点击下图的Create按钮
填写Client信息,这边我们创建一个名为keycloakDemo的Client。
点击Client ID或者后面的Edit都可进入Client配置界面
设置一个名字,然后你就可以给你自己的realm设置各种对象了。比如创建用户,创建一个角色,给用户授予角色等等。例如:我创建一个USER的角色,创建一个testuser01用户,然后给这个用户授予USER角色:
选择左边Role菜单,点击表格右上角的Add Role
在这里,我们添加两个角色,角色名分别为demoUser和notDemoUser。
选择左侧User菜单,选择表格右上角的Add User
在这里,我们创建两个角色demouser和notdemouser
创建好用户后,选择Credentials,并在下方输入两次密码并把Tempoorary右侧的On点一下改成Off(不改的话首次登陆需要修改密码),给用户添加密码
色创建好后,现在就需要将客户端和角色进行关联了。否则用户登录进去后会提示没有权限。创建好用户后进入用户配置界面,选择Role Mappings,并在下方Realm Roles中选择需要添加的角色,并点击Add selected按钮即可添加用户角色。在这里,我们给demouser分配了demoUser角色,给notdemouser分配了notDemoUser角色。角
1、选择左侧Clients,选择我们的keycloakDemo,进入配置页面
2、选择Scope,将默认的Full Scope Allowed后面的On点击改为Off
3、选择我们分配的角色——demoUser,点击Add selected按钮添加到右侧
4、映射成功
在这里我们创建一个名为keycloakdemo的web项目
添加依赖管理,引入Keycloak adapter的bom
注意,bom版本需要和keycloak版本一致
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bomgroupId>
<artifactId>keycloak-adapter-bomartifactId>
<version>10.0.1version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
添加Keycloak的starter
<dependency>
<groupId>org.keycloakgroupId>
<artifactId>keycloak-spring-boot-starterartifactId>
<version>10.0.1version>
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登陆,页面显示如下
假设我们有两个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