How to manage a multipage app with user authentication

Is it possible to use multipage app feature with user authentication with streamlit? Iā€™ve made a multipage app with strealit-authenticator, but when i make an authentication for user in my ā€œmain pageā€ the login page appear and protect only on the ā€œmain pageā€, other pages can access on the sidebar without having to login.
Please help! Thank youā€¦

6 Likes

i also encountered this question. have you already solved it?

1 Like

This can be soived using st.session_state in Streamlit. You can setup the main file like:

import streamlit as st
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader

st.set_page_config(page_title="Home", page_icon="šŸ ", layout="wide")

def st_authenticator():
    with open('data/config.yaml') as file:
        config = yaml.load(file, Loader=SafeLoader)
        file.close()

    authenticator = stauth.Authenticate(
        config['credentials'],
        config['cookie']['name'],
        config['cookie']['key'],
        config['cookie']['expiry_days'],
        config['preauthorized']
    )

    return authenticator

authenticator  = st_authenticator()
name, authentication_status, username = authenticator.login("Login", "main")

if authentication_status:
    st.session_state.authentication_status = True
    authenticator.logout('**Logout**', 'main', key='unique_key')
elif authentication_status is False:
    st.session_state.authentication_status = False
    st.error('Username/password is incorrect')
elif authentication_status is None:
    st.session_state.authentication_status = None
    st.warning('Please enter your username and password')

And include the below line of code in other pages (after importing libraries). For example in ā€˜pages/1_FirstPage.pyā€™

# import libraries here

if not st.session_state.authentication_status:
    st.info('Please Login from the Home page and try again.')
    st.stop()

# rest of the operations

1 Like

Hi, Iā€™m using this solution. But i found an issue if you reload the page in another page that doesnā€™t have the st.session_statue.authentication_status initialization it shows an error because it doesnā€™t exist.

Also is there any way to hide the options in the multi page menu in the case it isnā€™t initialized? or to redirect to the home and go back?

Thanks in advance

1 Like

Did anyone find a solution for this problem? I am facing it right now as wellā€¦

1 Like
if not st.session_state.get('authentication_status', False):
    st.info('Please Login from the Home page and try again.')
    st.stop()
2 Likes

I make a sample streamlit app dedicated for multi-page using the streamlit-authenticator library that can be used as a template or just for learning. It has login page, etc and can survive page reloads - meaning the user is re-logged in automatically. It also supports a user role, admin or not, and page are shown depending on the role of the user who logged in.

4 Likes

Thereā€™s also a demo app from @blackary showung how to create a multipage app with authentication

Demo app at:

Hope that helps!

1 Like