keycloak18.0.0==前后端分离项目中使用,前端react后端springboot

配置keycloak

启动keycloak18

新建一个realm,名字叫test1

新建两个client,一个用于前端,一个用于后端

第一个  react

http://localhost:8081/auth/realms/test1/react/

第二个 backend-service

在两个client下分别创建role

testRole

backend-service

编写代码

代码结构如下

详细代码见资源绑定

或者git

demo-keycloak-full: keycloak前后端分离项目

流程解释

整个代码的流程就是授权码的流程:

1用户访问前端页面,
2前端页面检测到未登录,就会跳转到keycloak登录也要要求用户登录,
http://localhost:8081/auth
/realms/test1/protocol/openid-connect/auth?
client_id=react&
redirect_uri=http%3A%2F%2Flocalhost%3A3000%2F&
state=f8861845-193f-4d4d-b06e-22340b2be2c8&
response_mode=fragment&
response_type=code&
scope=openid&
nonce=b46aeb99-109d-4e01-a553-f9abb9ddb652&
code_challenge=AkVISpppGpTAdOYe9jH8UFjk_WJt-UEmI5qoKWJIars&
code_challenge_method=S256
3用户输入账号密码登录成功后,keycloak回调到前端代码并返回授权码
4前端带上授权码去获取token,keycloak返回token 

http://localhost:8081/auth/realms/test1/protocol/openid-connect/token

5前端带上token请求后端的商品列表,

6后端收到请求后会校验token并验证该token中指出的用户的role是否有权限访问products接口。

这里,后端会从keycloak获取公钥并保存,然后用公钥来验证前端发来的token

当请求到达Spring Boot应用时,Keycloak Adapter会自动执行以下步骤来验证Token:

  1. 抽取Token:从HTTP请求的Authorization头部抽取Bearer Token。
  2. 验证Token:Adapter使用公钥(从Keycloak服务器的/protocol/openid-connect/certs端点获取)来验证Token的签名。此外,它还会验证Token的有效性,包括但不限于检查Token的过期时间、受众(aud)声明等。
  3. 设置安全上下文:一旦Token通过验证,Adapter会根据Token中的声明(claims)构建一个Authentication对象,并将其设置到Spring Security的SecurityContextHolder中。这使得你可以在你的应用中任何地方访问到当前用户的身份信息和角色。

org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter#attemptAuthentication-----------AuthOutcome result = authenticator.authenticate();

org.keycloak.adapters.RequestAuthenticator#authenticate-----------AuthOutcome outcome = bearer.authenticate(facade);

org.keycloak.adapters.rotation.AdapterTokenVerifier#verifyToken

7前端会定时检查token是否过期,过期了的话会带上refresh token去获取新的token(access token)

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 09:48:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 09:48:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 09:48:07       82 阅读
  4. Python语言-面向对象

    2024-03-14 09:48:07       91 阅读

热门阅读

  1. react diff 原理

    2024-03-14 09:48:07       46 阅读
  2. C语言下使用SQL语言

    2024-03-14 09:48:07       38 阅读
  3. 探索大语言模型(LLM):部分数据集介绍

    2024-03-14 09:48:07       46 阅读
  4. 同程旅行前端面试汇总

    2024-03-14 09:48:07       41 阅读
  5. 数据结构导航 -- 38篇

    2024-03-14 09:48:07       35 阅读
  6. gen_arrow_contour_xld

    2024-03-14 09:48:07       42 阅读
  7. wayland(xdg_wm_base) + egl + opengles 光照模型实例(十五)

    2024-03-14 09:48:07       48 阅读
  8. OMP实现MATLAB压缩感知实例

    2024-03-14 09:48:07       47 阅读
  9. vue中使用video.js,且可以截图、录制和下载视频

    2024-03-14 09:48:07       74 阅读
  10. CSS 01

    CSS 01

    2024-03-14 09:48:07      33 阅读
  11. Rust 如何优雅关闭 channel

    2024-03-14 09:48:07       46 阅读
  12. 【MySQL 系列】MySQL 函数篇

    2024-03-14 09:48:07       37 阅读
  13. SQL进阶(五):With 函数 vs 视图函数

    2024-03-14 09:48:07       36 阅读
  14. 【 React 】React 中引入css的方式有哪几种?区别?

    2024-03-14 09:48:07       45 阅读
  15. CSS常见选择器

    2024-03-14 09:48:07       42 阅读