什么是Keycloak?怎么样使用Keycloak实现登录和权限验证?

什么是Keycloak?怎么样使用Keycloak实现登录和权限验证?


keycloak官方网站: https://www.keycloak.org/

Open Source Identity and Access Management(开源身份和访问管理)

image-20240514140226792

Keycloak是一个开源的身份和访问管理解决方案,它提供了诸如单点登录(SSO)多因素认证用户管理权限管理等功能。Keycloak可以帮助开发人员轻松地集成身份验证和授权功能到他们的应用程序中,而无需自己编写复杂的身份验证和授权逻辑

1、支持的协议:

Keycloak支持多种协议,其中一些主要的协议包括:

  1. OAuth 2.0:OAuth 2.0是一种开放标准的授权框架,用于授权第三方应用访问用户资源。Keycloak使用OAuth 2.0协议来实现授权码授权、密码授权、客户端凭证授权等授权流程。

  2. OpenID Connect:OpenID Connect是建立在OAuth 2.0之上的身份验证协议,用于验证用户身份并提供用户信息。Keycloak支持OpenID Connect协议,可以用于实现身份验证和单点登录。

  3. SAML:Security Assertion Markup Language(SAML)是一种基于XML的标准,用于在身份提供者和服务提供者之间交换认证和授权信息。Keycloak可以充当SAML身份提供者和服务提供者,实现单点登录和身份验证。

  4. LDAP:Lightweight Directory Access Protocol(LDAP)是一种用于访问和维护分布式目录服务的协议。Keycloak可以集成LDAP作为用户存储,实现用户认证和授权。

  5. Kerberos:Kerberos是一种网络身份验证协议,用于在不安全的网络中安全地认证用户和服务。Keycloak可以集成Kerberos,实现基于票据的身份验证。

  6. Social Login:Keycloak还支持社交登录,可以通过集成第三方身份提供者(如Google、Facebook、GitHub等)实现用户身份验证和授权。

它支持多种身份验证方式,包括用户名密码、LDAP、Active Directory、社交登录等。Keycloak还提供了一个直观的管理界面,方便管理员配置和管理用户、角色和权限。

2、安装与部署

官方手册网址:https://www.keycloak.org/guides

image-20240514140335749

在官网中提供了许多的部署方式,文档很详细,可以根据文档进行操作,很方便。

2.1、在windows本地安装

  1. 下载资源:keycloak-24.0.4.zip

  2. 解压到本地,安装即成功。

    image-20240514140901963

  3. 使用命令行启动

    bin\kc.bat start-dev
    

    image-20240514141052353

  4. 访问http://localhost:8080

    image-20240514141214351

2.2、在docker安装部署

docker部署文档

命令:

docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:24.0.4 start-dev

上述命令就是将docker部署并且进行启动,并设置管理员的用户名和密码都为admin,到时候可以登录查看。

访问http://localhost:8080即可。

3、keycloak使用–登录权限验证

3.1、首先使用管理员账号密码登录

(均为admin,或是自己设置)

image-20240514141737044

3.2、创建realm

image-20240514141842239

我创建的realm名为client

3.3、创建clients

image-20240514142029688

  1. 取名(Client ID)

    image-20240514142140265

    image-20240514142424649

  2. 设置重定向URIs

    image-20240514142711177

然后就可以在Clients list看见刚刚创建的client了

image-20240514142802227

3.4、创建角色

image-20240514142957339

image-20240514143027197

3.5、创建用户

image-20240514143125050

image-20240514143250277

image-20240514143411310

image-20240514143507288

3.6、对象关系映射

image-20240514143746995

image-20240514143807338

image-20240514143824663

4、在springboot项目中整合keycloak

4.1、创建html文件,设置对应的访问权限来访问

文件存在templates中:

image-20240514145308916

admin.html(只有管理员权限才能访问)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这里是管理员页面,只有admin权限才能访问</h1>
</body>
</html>

index.html(用户,管理员,游客均可访问)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这里是公共页面!</h1>
</body>
</html>

user.html(只有管理员和用户才能访问)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这里是用户页面,拥有user、admin可访问!</h1>
</body>
</html>

4.2、创建Controller接口类

package com.pzhu.keycloak;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/publicPage")
    public String home() {
        return "index";
    }

    @GetMapping("/user")
    public String user() {
        return "user";
    }

    @GetMapping("/admin")
    public String admin() {
        return "admin";
    }
}

4.3、applicaiotn.yml配置文件

在下面的配置文件中需要主要需要配置的是realm(你创建的realm的名称),resource(Clients 的id名称), credentials secret(你的Clients的密钥),其他都是固定的,可以照搬我下面的配置文件。

server:
  port: 8081

keycloak:
  realm: client  #域名
  resource: kc-springboot  #客户端id
  auth-server-url: http://localhost:8080 #对应的是keycloak的路径
  ssl-required: external
  public-client: false  #非public访问类型
  credentials:
    secret: bY7DnihsW2cMMLhnYQjyhLS0xk7479j5 #秘钥(来源于Client)
  securityConstraints:
    - auth-roles:  # 公共页面 无权限可访问
      security-collections:
        - name: any
        - patterns:
            - /publicPage

    - auth-roles: # 要user或者admin权限才可访问
        - user
        - admin
      security-collections:
        - name: user page
        - patterns:
            - /user

    - auth-roles: # 需要admin权限才能访问
        - admin
      security-collections:
        - name: admin
        - name: admin
          patterns:
            - /admin
spring:
  application:
    name: keycloak

其中,secret密钥来源于:

image-20240514145848247

5、启动项目

5.1、访问公共页面

image-20240514150454489

5.2、访问用户页面

访问路径http://localhost:8081/user就可以进入user页面,但是此页面只有用户和管理员身份才能访问,现在就跳转到keycloak的登录页面进行登录验证,输入我们的用户名(使用上述创建的user02用户和密码)。

image-20240514151109140

登录之后:image-20240514151152292

将路径切换为http://localhost:8081/admin来访问admin页面,并验证权限,现在是user角色登录,所以登录权限不够(报403错误,权限不足)

image-20240514151901630

5.3、访问admin页面

必须使用admin权限的用户才能访问admin页面

访问admin页面:http://localhost:8081/admin

使用创建,并具有admin角色的用户登录:

image-20240514152047802

可以访问:

image-20240514152206468

项目整合参考文章:https://blog.csdn.net/mltaozi/article/details/128033902

项目源码:https://pan.baidu.com/s/1Lxn1R1PtRFcxyD8Biw_2Pg?pwd=axqo

6、踩坑!!!

根据网上博主的分享和官方的文档,上述操作是可以实现的,但是在我创建之后发现报错,只能访问公共页面,登录之后admin连user.html都不能访问,报错就是权限的问题。

网页报错

image-20240514154243790

控制台报错

2023-12-18 16:23:10,874 ERROR [org.wildfly.security.http.oidc] (default task-6) status from server: 400
2023-12-18 16:23:10,874 ERROR [org.wildfly.security.http.oidc] (default task-6)    {"error":"invalid_grant","error_description":"Incorrect redirect_uri"}

于是找了很久,去github上看了看,发现了问题:文章链接https://github.com/keycloak/keycloak/discussions/25684

那个大佬是这样说的:

image-20240514154043996

翻译:是的!这是iss,如果你看到两个redirect_uri只是因为iss参数而不同。转到您的客户端,在“高级”选项卡中将“从身份验证响应中排除颁发者”设置为“打开”。

这个问题与redirect_uri验证中的更改无关,而是与规范引入的新iss参数有关。您的客户端不会将其从uri中删除。

然后我就**在“高级”选项卡中将“从身份验证响应中排除颁发者”设置为“打开”**然后就可以访问了。

  1. 选择clients:

    image-20240514154630089

  2. 选择advanced:

    image-20240514154745925

  3. 打开“从身份验证响应中排除颁发者”

    image-20240514154850124

现在就可以登录拉!困扰很久的WTF!

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼诺尔雷迪亚兹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值