python – 使用Superset的OpenID / Keycloak
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 使用Superset的OpenID / Keycloak,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5095字,纯文字阅读大概需要8分钟。
内容图文
![python – 使用Superset的OpenID / Keycloak](/upload/InfoBanner/zyjiaocheng/701/163303b08efe41558abe54529f635410.jpg)
我想在Superset环境中使用keycloak对我的用户进行身份验证.
Superset使用flask-openid,如在flask-security中实现的:
> http://flask-appbuilder.readthedocs.io/en/latest/_modules/flask_appbuilder/security/manager.html
> https://pythonhosted.org/Flask-OpenID/
要启用与常规用户身份验证(数据库)不同的用户身份验证,您需要覆盖superset_config.py文件中的AUTH_TYPE参数.您还需要提供对openid-connect领域的引用并启用用户注册.据我了解,它应该看起来像这样:
from flask_appbuilder.security.manager import AUTH_OID
AUTH_TYPE = AUTH_OID
OPENID_PROVIDERS = [
{ 'name':'keycloak', 'url':'http://localhost:8080/auth/realms/superset' }
]
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Gamma'
使用此配置,登录页面将更改为用户可以选择所需OpenID提供程序的提示(在我们的示例中为keycloak).我们还有两个按钮,一个用于登录(对于现有用户),另一个用于注册为新用户.
我希望这些按钮中的任何一个都能带我到我的keycloak登录页面.但是,这不会发生.相反,我被重定向回到了
登录页面.
在我按下注册按钮的情况下,我收到一条消息“此刻无法注册您,请稍后再试”.当我按下登录按钮时,不会显示任何消息. Superset日志显示加载登录页面的请求,但没有对keycloak的请求.我使用Google OpenID提供程序尝试了相同的操作,该工作正常.
由于我没有看到对keycloak的请求,这让我觉得我要么在某处丢失配置设置,要么我使用了错误的设置.你能帮我弄清楚我应该使用哪些设置吗?
解决方法:
我设法解决了自己的问题.主要问题是由于我对超集正在使用的flask-openid插件做出了错误的假设.这个插件实际上支持OpenID 2.x,但不支持OpenID-Connect(这是Keycloak实现的版本).
作为一种解决方法,我决定切换到flask-oidc插件.切换到新的身份验证提供程序实际上需要一些挖掘工作.要集成插件,我必须遵循以下步骤:
为keycloak配置flask-oidc
不幸的是,flask-oidc不支持Keycloak生成的配置格式.相反,您的配置应如下所示:
{
"web": {
"realm_public_key": "<YOUR_REALM_PUBLIC_KEY>",
"issuer": "http://<YOUR_DOMAIN>/auth/realms/<YOUR_REALM_ID>",
"auth_uri": "http://<YOUR_DOMAIN>/auth/realms/<YOUR_REALM_ID>/protocol/openid-connect/auth",
"client_id": "<YOUR_CLIENT_ID>",
"client_secret": "<YOUR_SECRET_KEY>",
"redirect_urls": [
"http://<YOUR_DOMAIN>/*"
],
"userinfo_uri": "http://<YOUR_DOMAIN>/auth/realms/<YOUR_REALM_ID>/protocol/openid-connect/userinfo",
"token_uri": "http://<YOUR_DOMAIN>/auth/realms/<YOUR_REALM_ID>/protocol/openid-connect/token",
"token_introspection_uri": "http://<YOUR_DOMAIN>/auth/realms/<YOUR_REALM_ID>/protocol/openid-connect/token/introspect"
}
}
Flask-oidc期望配置在文件中.我已将其存储在client_secret.json中.您可以在superset_config.py中配置配置文件的路径.
扩展安全管理器
首先,您需要确保烧瓶停止使用flask-openid广告,而不是使用flask-oidc.为此,您需要创建自己的安全管理器,将flask-oidc配置为其身份验证提供程序.我已经实现了我的安全管理器:
from flask_appbuilder.security.manager import AUTH_OID
from flask_appbuilder.security.sqla.manager import SecurityManager
from flask_oidc import OpenIDConnect
class OIDCSecurityManager(SecurityManager):
def __init__(self,appbuilder):
super(OIDCSecurityManager, self).__init__(appbuilder)
if self.auth_type == AUTH_OID:
self.oid = OpenIDConnect(self.appbuilder.get_app)
self.authoidview = AuthOIDCView
要在Superset中启用OpenID,您以前必须将身份验证类型设置为AUTH_OID.我的安全管理器仍然执行超类的所有行为,但使用OpenIDConnect对象覆盖oid属性.此外,它使用自定义的OpenID身份验证视图替换默认的OpenID身份验证视图.我这样实施了我的:
from flask_appbuilder.security.views import AuthOIDView
from flask_login import login_user
from urllib import quote
class AuthOIDCView(AuthOIDView):
@expose('/login/', methods=['GET', 'POST'])
def login(self, flag=True):
sm = self.appbuilder.sm
oidc = sm.oid
@self.appbuilder.sm.oid.require_login
def handle_login():
user = sm.auth_user_oid(oidc.user_getfield('email'))
if user is None:
info = oidc.user_getinfo(['preferred_username', 'given_name', 'family_name', 'email'])
user = sm.add_user(info.get('preferred_username'), info.get('given_name'), info.get('family_name'), info.get('email'), sm.find_role('Gamma'))
login_user(user, remember=False)
return redirect(self.appbuilder.get_url_for_index)
return handle_login()
@expose('/logout/', methods=['GET', 'POST'])
def logout(self):
oidc = self.appbuilder.sm.oid
oidc.logout()
super(AuthOIDCView, self).logout()
redirect_url = request.url_root.strip('/') + self.appbuilder.get_url_for_login
return redirect(oidc.client_secrets.get('issuer') + '/protocol/openid-connect/logout?redirect_uri=' + quote(redirect_url))
我的视图会覆盖/ login和/ logout端点上的行为.登录时,将运行handle_login方法.它要求用户由OIDC提供商进行身份验证.在我们的例子中,这意味着用户将首先被重定向到Keycloak以登录.
在身份验证时,用户将重定向回Superset.接下来,我们查看是否识别用户.如果没有,我们会根据用户的OIDC用户信息创建用户.最后,我们将用户登录到Superset并将其重定向到登录页面.
注销时,我们需要使这些cookie无效:
>超集会议
> OIDC令牌
> Keycloak设置的cookie
默认情况下,Superset只会照顾第一个.扩展注销方法负责所有三点.
配置Superset
最后,我们需要在superset_config.py中添加一些参数.这就是我配置我的方式:
'''
AUTHENTICATION
'''
AUTH_TYPE = AUTH_OID
OIDC_CLIENT_SECRETS = 'client_secret.json'
OIDC_ID_TOKEN_COOKIE_SECURE = False
OIDC_REQUIRE_VERIFIED_EMAIL = False
CUSTOM_SECURITY_MANAGER = OIDCSecurityManager
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Gamma'
内容总结
以上是互联网集市为您收集整理的python – 使用Superset的OpenID / Keycloak全部内容,希望文章能够帮你解决python – 使用Superset的OpenID / Keycloak所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。