当前位置: 首页 > 知识库问答 >
问题:

当我在注销flask应用程序后按backspace时,我仍然能够使用flask Dash访问受限页面

黄伟
2023-03-14
from flask import session
from functools import wraps
import flask
from flask import Flask, redirect, url_for, render_template, session
from flask_dance.contrib.google import make_google_blueprint, google
from flask_login import LoginManager, login_user , logout_user , current_user , login_required
from flask_session import Session
import time, dash, os, json, flask, configparser, shutil, base64, io
import pandas as pd
import numpy as np
from plotly.subplots import make_subplots
from dash_table import DataTable
import dash_html_components as html
import dash_core_components as dcc
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State
import dash_daq as daq
import plotly.graph_objs as go
from dash.exceptions import PreventUpdate
import dash_table.FormatTemplate as FormatTemplate 
from dash_table.Format import Format
from dash_extensions import Download 


def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        user = dict(session).get('profile', None)
        # You would add a check here and usethe user id or something to fetch
        # the other data for that user/check if they exist
        if user:
            return f(*args, **kwargs)
        return render_template('index.html')
    return decorated_function


# AS simeple as possbile flask google oAuth 2.0
from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth
import os
from datetime import timedelta
#dotenv setup
from dotenv import load_dotenv
load_dotenv()


# App config
server = Flask(__name__)
server.secret_key = 'xxxx'
server.config['SESSION_COOKIE_NAME'] = 'google-login-session'
server.config['PERMANENT_SESSION_LIFETIME'] = timedelta(seconds=120)

# oAuth Setup
oauth = OAuth(server)
google = oauth.register(
    name='google',
    client_id='xxxx',
    client_secret='xxxx',
    access_token_url='https://accounts.google.com/o/oauth2/token',
    access_token_params=None,
    authorize_url='https://accounts.google.com/o/oauth2/auth',
    authorize_params=None,
    api_base_url='https://www.googleapis.com/oauth2/v1/',
    userinfo_endpoint='https://openidconnect.googleapis.com/v1/userinfo',  # This is only needed if using openId to fetch user info
    client_kwargs={'scope': 'openid email profile'},
)


@server.route('/')
@login_required
def index():
    email = dict(session)['profile']['email']
    return render_template('index.html')


@server.route('/login')
def login():
    google = oauth.create_client('google')  # create the google oauth client
    redirect_uri = url_for('authorize', _external=True)
    return google.authorize_redirect(redirect_uri)


@server.route('/authorize')
def authorize():
    google = oauth.create_client('google')  # create the google oauth client
    token = google.authorize_access_token()  # Access token from google (needed to get user info)
    resp = google.get('userinfo')  # userinfo contains stuff u specificed in the scrope
    user_info = resp.json()
    user = oauth.google.userinfo()  # uses openid endpoint to fetch user info
    # Here you use the profile/user data that you got and query your database find/register the user
    # and set ur own data in the session not the profile from google
    session['profile'] = user_info
    session.permanent = False  # make the session permanant so it keeps existing after broweser gets closed
    return redirect('/Planner/')


@server.route('/Planner/logout')
def logout():
    for key in list(session.keys()):
        session.pop(key)
    return redirect('/')

app = dash.Dash(__name__, server = server, 
                url_base_pathname='/Planner/')
app.scripts.config.serve_locally = False
app.title = 'Scenario Planner'
app.layout = html.Div([html.Div('Hey'), html.Br(), html.A('Logout', href = './logout')])


if __name__ == "__main__":
    server.run(debug=False)

这是我的密码。基本上,我的代码中也运行着一个plotly dash应用程序。除了限制对dash应用程序的访问之外,其他一切都正常。如果我使用localhost:5000/Planner,则无论身份验证如何,都会显示我的应用程序。

如果我遵循身份验证流程,登录,然后注销,然后单击退格,破折号应用程序仍然可以访问。有没有办法修改这段代码来限制这种访问。

共有1个答案

佟阳云
2023-03-14

使用之前的答案,在一定程度上解决了这个问题:在烧瓶应用程序中运行Dash应用程序,我想出了这个解决方案:

您可以将其添加到代码中:

@server.route('/plotly_dashboard') 
@login_required
def render_dashboard():
    return flask.redirect('/Planner')
 类似资料:
  • 它给出: 下面是我使用的代码: 方法verifyUserExistance是; 我就是这样处理注销的;

  • 每当我单击登录页面中的“注册”按钮时,应用程序就会崩溃,无法移动到下一个活动。我已经在这个问题上纠缠了一天,似乎在任何地方都找不到解决办法。 下面是我为注册按钮方法编写的代码。(和是文本输入布局) Logcat在第7行显示错误,即ref.child(…行)。我尝试了第7行的替代方法,如:

  • 我正在使用 jwt 令牌在我的 angular(客户端)和 Spring 引导(服务器)应用程序中对用户进行身份验证。我希望用户在令牌过期时自动注销应用程序。我使用拦截器的概念来检查令牌是否过期,并向用户显示一个弹出窗口,说“您的会话已过期”并注销应用程序,如下所示: 这工作正常,留下一个与弹出窗口相关的问题。我在向服务器发送登录请求时,也会在执行登录请求时弹出此会话过期的弹出窗口,作为拦截器拦截

  • 如何修复此错误\Android\应用程序\src\debug\AndroidManifest.xml 调试控制台 D:\工作\实习生\代码\应用程序\kathana\android\app\src\debug\AndroidManifest.xml:27: 9-33:20错误:android:导出需要显式指定元素 失败:构建失败,出现异常。 哪里出错了:任务': app: process Debu

  • 在我的Spring会话中,我使用了 redis 服务器。现在我正在使用 Angular 7。 这里代码1 2 3 4 > 点击注销按钮后,我的页面将重新加载,但注意happen.it将与上一页相同。 如果我把{headers:headers}放在返回的loginservice中。logout(),则会出现错误 (http.js:167),位于HttpHeaders.push../node_modu

  • 问题内容: 在我的应用程序中,我使用jsapi实现了Google注销。 现在,我需要在我的应用程序中单击一个按钮的同时从Google登出该用户。如何使用JavaScript实现此功能,或者至少每次用户登录时它都必须询问Google登录页面。 我已经尝试过,但是似乎没有用。 问题答案: OAuth概述:他/她说的用户是他/她吗? 我不确定您是否使用OAuth来登录Stack Overflow,例如“