控制谁可以访问您的 Streamlit 仪表板
让 Django 的权限系统负责权限控制
![](https://aitechtogether.com/wp-content/uploads/2022/05/ea982b3d-1ed1-4e05-9817-fb67b96bb7e9.webp)
身份验证可能会阻止外人,但我们需要一个授权流程来控制谁可以看到什么。
Steramlit 简化了数据科学家最大的困难之一——构建一个应用程序来与他们的机器学习模型进行交互。它提供了一组声明性方法来创建 Web 组件。[0]
但是当您与他人共享 Streamlit 应用程序时,安全性是一个问题。 Streamlit 有一个内置的解决方案来限制对用户的访问。但这远非完美。
在上一篇文章中,我分享了如何使用 Django 的身份验证框架来提高 Streamlit 应用程序的安全性。[0]
这篇文章延续了上一篇文章,涵盖了 Streamlit 应用程序的更精细的访问控制策略。我建议您在深入研究之前阅读第一个。
· 为什么需要授权控制?
· 使用 Django 控制仪表板权限。
∘ 在 Django 管理控制台中创建用户组。
∘ 在 Django 管理控制台中创建用户。
∘ 在 Streamlit 应用程序中检查权限[0][1][2][3][4]
为什么我们需要授权控制?
登录屏幕可防止身份不明的人访问系统。我们称之为用户认证。
然而,身份验证只是其中一项,但却是您的安全清单中必不可少的一项。有几种方法可以改善这一点。
例如,您可以对防火墙设置 IP 限制。但这样做是阻止一大群人的高级规则。[0]
如果您想要精细控制怎么办?
假设您只需要向员工显示仪表板的特定部分。但是您可以决定向团队领导提供团队级别的仪表板和个人仪表板。
这样做的能力是访问控制。
我们已经讨论了为什么 Stramlit 建议的用户身份验证流程对于生产级应用程序来说不够好。我们已经使用 Django 来弥补差距。
Streamlit 也没有授权选项。让我们继续扩展 Django 身份验证以处理权限。
使用 Django 控制仪表板权限。
计划很简单。
将用户分配到特定组。一个用户也可以在多个组中。我们可以在管理界面中执行此操作。
然后在 Streamlit 应用程序中,我们检查登录用户的组成员身份。
如果此检查通过,我们将渲染仪表板。否则,我们将显示一条消息,“您无法查看此仪表板”。
但是我们不是首先需要这些组吗?让我们从那里开始。
在 Django 管理控制台中创建用户组。
如果您正在关注上一篇文章,那么您现在将运行一个 Django 应用程序,并且您可以访问管理门户。
我们还创建了用户。同样的方法,让我们点击“组”旁边的添加按钮,添加以下组。
- Manager
- Data Science Team
- Finance Team
![](https://aitechtogether.com/wp-content/uploads/2022/05/619b1dd5-83ec-4d98-b960-aa6f7af6d149.webp)
在 Django 管理控制台中创建用户。
在上一篇文章中,我们已经了解了如何从管理控制台添加新用户。让我们添加一些具有以下组成员身份的用户。
- A — Manager
- B — 数据科学团队成员
- C — 财务团队成员
- D——没有团队成员资格。
您可以通过将组从可用组移动到所选部分来分配它们。单击“保存”后,您可以在用户创建页面上找到此部分。
![](https://aitechtogether.com/wp-content/uploads/2022/05/25e8ef6b-dec8-4dd5-9c73-9ed365bf382f.webp)
在 Streamlit 应用程序中检查权限
最后,我们调整我们的精简应用程序代码以检查组成员身份。
如果用户 (A) 是 Managers 组的成员,他们可以访问所有仪表板。该应用程序不需要进一步的权限。
如果用户 (B & C) 只有团队成员,他们可以访问团队的仪表板。但不是其他仪表板。
最后,不属于任何组的用户 (D) 可以登录。但他们无法访问任何仪表板。
调整后的流光应用代码将如下所示:
# Imports
# -----------------------------------------------------------
import os
import streamlit as st
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
application = get_wsgi_application()
from django.contrib.auth import authenticate
def check_password():
"""Returns `True` if the user had a correct password."""
def password_entered():
"""Checks whether a password entered by the user is correct."""
user = authenticate(
username=st.session_state["username"], password=st.session_state["password"]
)
if user is not None:
st.session_state["password_correct"] = True
del st.session_state["password"] # don't store username + password
del st.session_state["username"]
# Add the user object to Streamlit session
st.session_state.user = user
else:
st.session_state["password_correct"] = False
if "password_correct" not in st.session_state:
# First run, show inputs for username + password.
st.text_input("Username", on_change=password_entered, key="username")
st.text_input(
"Password", type="password", on_change=password_entered, key="password"
)
return False
elif not st.session_state["password_correct"]:
# Password not correct, show input + error.
st.text_input("Username", on_change=password_entered, key="username")
st.text_input(
"Password", type="password", on_change=password_entered, key="password"
)
st.error("😕 User not known or password incorrect")
return False
else:
# Password correct.
return True
if check_password():
with st.sidebar:
report = st.selectbox(
"Choose a dashboard",
("Data Science Team KPI", "Finance Team KPI"),
)
st.write(f"Hello, {st.session_state.user.username}!")
# Data Science Dashboard Section
if report == "Data Science Team KPI":
if st.session_state.user.groups.filter(
name__in=["Manager", "Data Science Team"]
).exists():
st.title("Data Science KPI Dashboard")
else:
st.write("Sorry, you don't have permissions to view this dashboard!")
# Finance Dashboard Section
elif "Finance Team KPI":
if st.session_state.user.groups.filter(
name__in=["Manager", "Finance Team"]
).exists():
st.title("Finance KPI Dashboard")
else:
st.write("Sorry, you don't have permissions to view this dashboard!")
# Section when no dashboard is selected
else:
st.write("Please select a Dashboard")
在上面的代码中,关键的是,
- 第 30 行:在会话中存储 Django 用户对象
- 第 65 行:检查经理或数据科学团队成员资格的条件
- 第 74 行:匹配经理或财务团队成员的条件
让我们运行我们的应用程序,看看权限是否正常工作。要启动服务器,让我们运行:
streamlit run quickstart.py
如果我们在浏览器上检查应用程序,这就是它对我们所有四个用户的工作方式。
![](https://aitechtogether.com/wp-content/uploads/2022/05/5b8046f9-e137-4d8d-8c9a-50bb9bca94ad.gif)
Final thoughts
我们进一步扩展了 Streamlit 应用程序以处理本文中的权限。
我们通过使用 Django 的内置权限系统从它的管理界面中受益。我们可以使用这个界面来创建新的用户和用户组以及管理组成员。
正如我们在上一篇文章中看到的,Streamlit 还很年轻。开发其认证和授权系统需要时间。在那之前,我们可以使用 Django 更安全地构建生产级应用程序。
感谢阅读,朋友!在 LinkedIn、Twitter 和 Medium 上向我问好。[0][1][2]
还不是中型会员?请使用此链接成为会员,因为我不会为您支付额外费用,因为我推荐您赚取少量佣金。[0]
文章出处登录后可见!