控制谁可以访问您的 Streamlit 仪表板

让 Django 的权限系统负责授权控制——身份验证可能会阻止外人,但我们需要一个授权流程来控制谁可以看到什么。 Steramlit 简化了数据科学家最大的困难之一——构建一个应用程序来与他们的机器学习模型进行交互。它提供了一组声明性方法来创建 Web 组件。但是安全…

控制谁可以访问您的 Streamlit 仪表板

让 Django 的权限系统负责权限控制

身份验证可能会阻止外人,但我们需要一个授权流程来控制谁可以看到什么。

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

在 Django 管理控制台中创建用户。

在上一篇文章中,我们已经了解了如何从管理控制台添加新用户。让我们添加一些具有以下组成员身份的用户。

  • A — Manager
  • B — 数据科学团队成员
  • C — 财务团队成员
  • D——没有团队成员资格。

您可以通过将组从可用组移动到所选部分来分配它们。单击“保存”后,您可以在用户创建页面上找到此部分。

在 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

如果我们在浏览器上检查应用程序,这就是它对我们所有四个用户的工作方式。

Final thoughts

我们进一步扩展了 Streamlit 应用程序以处理本文中的权限。

我们通过使用 Django 的内置权限系统从它的管理界面中受益。我们可以使用这个界面来创建新的用户和用户组以及管理组成员。

正如我们在上一篇文章中看到的,Streamlit 还很年轻。开发其认证和授权系统需要时间。在那之前,我们可以使用 Django 更安全地构建生产级应用程序。

感谢阅读,朋友!在 LinkedIn、Twitter 和 Medium 上向我问好。[0][1][2]

还不是中型会员?请使用此链接成为会员,因为我不会为您支付额外费用,因为我推荐您赚取少量佣金。[0]

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年5月13日
下一篇 2022年5月13日

相关推荐