什么是Keycloak?怎么样使用Keycloak实现登录和权限验证?
文章目录
- 什么是Keycloak?怎么样使用Keycloak实现登录和权限验证?
- Open Source Identity and Access Management(开源身份和访问管理)
- 1、支持的协议:
- 2、安装与部署
- 2.1、在windows本地安装
- 2.2、在docker安装部署
- 3、keycloak使用--登录权限验证
- 3.1、首先使用管理员账号密码登录
- 3.2、创建realm
- 3.3、创建clients
- 3.4、创建角色
- 3.5、创建用户
- 3.6、对象关系映射
- 4、在springboot项目中整合keycloak
- 4.1、创建html文件,设置对应的访问权限来访问
- 4.2、创建Controller接口类
- 4.3、applicaiotn.yml配置文件
- 5、启动项目
- 5.1、访问公共页面
- 5.2、访问用户页面
- 5.3、访问admin页面
- 6、踩坑!!!
keycloak官方网站: https://www.keycloak.org/
Open Source Identity and Access Management(开源身份和访问管理)
Keycloak是一个开源的身份和访问管理解决方案,它提供了诸如单点登录(SSO)、多因素认证、用户管理、权限管理等功能。Keycloak可以帮助开发人员轻松地集成身份验证和授权功能到他们的应用程序中,而无需自己编写复杂的身份验证和授权逻辑。
1、支持的协议:
Keycloak支持多种协议,其中一些主要的协议包括:
-
OAuth 2.0:OAuth 2.0是一种开放标准的授权框架,用于授权第三方应用访问用户资源。Keycloak使用OAuth 2.0协议来实现授权码授权、密码授权、客户端凭证授权等授权流程。
-
OpenID Connect:OpenID Connect是建立在OAuth 2.0之上的身份验证协议,用于验证用户身份并提供用户信息。Keycloak支持OpenID Connect协议,可以用于实现身份验证和单点登录。
-
SAML:Security Assertion Markup Language(SAML)是一种基于XML的标准,用于在身份提供者和服务提供者之间交换认证和授权信息。Keycloak可以充当SAML身份提供者和服务提供者,实现单点登录和身份验证。
-
LDAP:Lightweight Directory Access Protocol(LDAP)是一种用于访问和维护分布式目录服务的协议。Keycloak可以集成LDAP作为用户存储,实现用户认证和授权。
-
Kerberos:Kerberos是一种网络身份验证协议,用于在不安全的网络中安全地认证用户和服务。Keycloak可以集成Kerberos,实现基于票据的身份验证。
-
Social Login:Keycloak还支持社交登录,可以通过集成第三方身份提供者(如Google、Facebook、GitHub等)实现用户身份验证和授权。
它支持多种身份验证方式,包括用户名密码、LDAP、Active Directory、社交登录等。Keycloak还提供了一个直观的管理界面,方便管理员配置和管理用户、角色和权限。
2、安装与部署
官方手册网址:https://www.keycloak.org/guides
在官网中提供了许多的部署方式,文档很详细,可以根据文档进行操作,很方便。
2.1、在windows本地安装
-
下载资源:keycloak-24.0.4.zip
-
解压到本地,安装即成功。
-
使用命令行启动
bin\kc.bat start-dev
-
访问http://localhost:8080
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,或是自己设置)
3.2、创建realm
我创建的realm名为client
3.3、创建clients
-
取名(Client ID)
-
设置重定向URIs
然后就可以在Clients list看见刚刚创建的client了
3.4、创建角色
3.5、创建用户
3.6、对象关系映射
4、在springboot项目中整合keycloak
4.1、创建html文件,设置对应的访问权限来访问
文件存在templates中:
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密钥来源于:
5、启动项目
5.1、访问公共页面
5.2、访问用户页面
访问路径http://localhost:8081/user就可以进入user页面,但是此页面只有用户和管理员身份才能访问,现在就跳转到keycloak的登录页面进行登录验证,输入我们的用户名(使用上述创建的user02用户和密码)。
登录之后:
将路径切换为http://localhost:8081/admin来访问admin页面,并验证权限,现在是user角色登录,所以登录权限不够(报403错误,权限不足)
5.3、访问admin页面
必须使用admin权限的用户才能访问admin页面
访问admin页面:http://localhost:8081/admin。
使用创建,并具有admin角色的用户登录:
可以访问:
项目整合参考文章:https://blog.csdn.net/mltaozi/article/details/128033902
项目源码:https://pan.baidu.com/s/1Lxn1R1PtRFcxyD8Biw_2Pg?pwd=axqo
6、踩坑!!!
根据网上博主的分享和官方的文档,上述操作是可以实现的,但是在我创建之后发现报错,只能访问公共页面,登录之后admin连user.html都不能访问,报错就是权限的问题。
网页报错:
控制台报错:
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。
那个大佬是这样说的:
翻译:是的!这是iss,如果你看到两个redirect_uri只是因为iss参数而不同。转到您的客户端,在“高级”选项卡中将“从身份验证响应中排除颁发者”设置为“打开”。
这个问题与redirect_uri验证中的更改无关,而是与规范引入的新iss参数有关。您的客户端不会将其从uri中删除。
然后我就**在“高级”选项卡中将“从身份验证响应中排除颁发者”设置为“打开”**然后就可以访问了。
-
选择clients:
-
选择advanced:
-
打开“从身份验证响应中排除颁发者”
现在就可以登录拉!困扰很久的WTF!