OAuth2 服务器Keycloak中的Realm

前几篇我和大家一起对Keycloak进行了粗略的了解。随着逐步的了解,我发现进入了一个误区,原本以为Spring Security整合Keycloak的重心在于Spring Security这一方面,事实上,我发现Keycloak关于Spring Security的Adapter的几个过滤器并没有可操作的空间,或许需要等弄明白了Keycloak本身之后才能有突破。所以今天我要弄明白的是Keycloak中的Realm

Realm

Realm翻译成中文为领域。用来逻辑隔离一些特定空间,有点多租户的感觉,不同的Realm之间互相隔离,有各自的特色配置,互不影响。

什么时候用到Realm

当特定数量用户之间需要隔离的时候、一系列服务需要统一进行资源管理的时候就用到了Realm。可能我描述的不够全面,至少目前我能感觉到的就是这样。

![](https://img-blog.csdnimg.cn/img_convert/8e912d8c9
f03ee2b77754411f08598e9.png)
realm包含的核心概念

比如我们需要开发一个应用,应用部署域名为felord.cn。我们可以这么定义一个名称为felord.cn的Realm,来管理该应用的角色、资源、和客户端,客户端开发可以专注于业务。整个Keycloak就像一个开放平台一样,集中式管理Realm的生命周期,这些Realm之间可以在OIDC协议下互联互通。

Master Realm

如果你看过之前我关于Keycloak的文章,可能会记得第一次启动Keycloak时会接触一个叫Master的Realm。这个是Keycloak内建的Realm,它的作用有点类似Linux中的root用户,主要是管理其它的Realm,Master Realm中的管理员账户有权查看和管理在Keycloak服务器实例上创建的任何其它Realm。

而且你会发现Master Realm创建的领域实际上是Master Realm的一个客户端,甚至它自己都是自己的客户端,而且名称遵循<realm name>-realm

而且你会发现Master Realm中创建的用户可以赋予其独有的两种角色:

  • admin 超级管理员,拥有管理Keycloak服务器上任何realm的完全访问权限。

  • create realm 拥有该角色就可以创建realm并获得该realm的完全管理权。

建议Master Realm用来管理其它Realm而不参与具体的业务。

其它Realm

其它Realm是指用Master创建的Realm。创建其它Realm非常简单,通过Master Realm的管理员即可创建。创建成功会有一些选项可供配置,但是一般情况下使用默认配置即可。

设置Realm管理账户

为前面我初始化的Realmfelord.cn创建独立的管理员账户有两种方式。

使用Master用户管理

我们在Master Realm中建立一个用户,并在其角色映射中剥夺admincreate-realm角色,同时在Client Roles中选中felord.cn-realm 把该客户端的所有角色都赋予建立的用户。例如:

这个用户属于Master的用户,但是管理着felord.cnRealm。你可以通过下面的格式的链接进行控制台管理操作:

http:///auth/admin/master/console/#/realms/{realm-name}

使用领域客户端用户管理

另一种方法是在felord.cn领域下建立一个用户,把其客户端realm-management的所有客户端角色赋予给该用户。这个用户属于felord.cn,因此只能通过以下链接登录管理控制台管理该领域:

http:///auth/admin/{realm-name}/console

一个用户只能从属于一个Realm。

扩展

Keycloak Admin Client是通过API操作管理Realm的一个客户端工具,我在上一篇已经介绍过了。结合本篇的一些概念可能你会更加深刻的理解如果操作管理Realm。

往期推荐

Java 17 将至,可能带来哪些新特性呢?

机械妖姬上门要源码后续结果来了!
重磅消息:Spring 6 和Spring Boot 3
短信验证码登录流程思路及详细步骤
反996,竟反掉了17%的薪水?!而隔壁的房贷还在涨,怎么就越反越糟糕了呢?

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取
图片转存中…(img-G7e28BYg-1719521622354)]

[外链图片转存中…(img-1EyNqL0e-1719521622355)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了搭建OAuth2服务器,您可以使用现有的OAuth2服务器实现,例如Authlib或OAuthlib。以下是使用Authlib搭建OAuth2服务器的步骤: 1.安装Authlib ```shell pip install authlib ``` 2.创建一个Flask应用程序 ```python from flask import Flask app = Flask(__name__) ``` 3.配置应用程序 ```python from authlib.integrations.flask_oauth2 import AuthorizationServer from authlib.integrations.sqla_oauth2 import create_query_client_func from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///oauth2.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'secret-key' app.config['OAUTH2_REFRESH_TOKEN_GENERATOR'] = True db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(40), unique=True) password = db.Column(db.String(100)) class Client(db.Model): id = db.Column(db.Integer, primary_key=True) client_id = db.Column(db.String(40), unique=True) client_secret = db.Column(db.String(55), nullable=False) client_name = db.Column(db.String(100), nullable=False) is_confidential = db.Column(db.Boolean) def get_client_id(self): return self.client_id def get_client_secret(self): return self.client_secret def check_redirect_uri(self, redirect_uri): return True def has_user_consent(self, user, scope): return True def get_default_redirect_uri(self): return 'http://localhost:5000/authorized' class OAuth2Client(db.Model): id = db.Column(db.Integer, primary_key=True) client_id = db.Column(db.String(40), db.ForeignKey('client.client_id')) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) user = db.relationship(User) client = db.relationship(Client) token_type = db.Column(db.String(40)) access_token = db.Column(db.String(255)) refresh_token = db.Column(db.String(255)) expires_at = db.Column(db.DateTime) query_client = create_query_client_func(db.session, Client) authorization = AuthorizationServer(app, query_client=query_client) ``` 4.实现授权和令牌端点 ```python from flask import jsonify, request from authlib.oauth2 import OAuth2Error from authlib.oauth2.rfc6749 import grants @app.route('/oauth/token', methods=['POST']) def issue_token(): grant_type = request.form.get('grant_type') if grant_type == 'password': return grants.ResourceOwnerPasswordCredentialsGrant().create_token_response() elif grant_type == 'client_credentials': return grants.ClientCredentialsGrant().create_token_response() elif grant_type == 'refresh_token': return grants.RefreshTokenGrant().create_token_response() raise OAuth2Error('unsupported_grant_type') @app.route('/oauth/authorize', methods=['GET', 'POST']) def authorize(): if request.method == 'GET': try: grant = authorization.validate_consent_request(end_user=User.query.get(1)) return grant.prompt except OAuth2Error as error: return jsonify(dict(error.get_body())) if request.method == 'POST': if request.form['confirm']: grant_user = User.query.get(1) return authorization.create_authorization_response(grant_user=grant_user) return jsonify({'error': 'User denied authorization'}) ``` 5.运行应用程序 ```shell export FLASK_APP=app.py flask run ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值