Spaces:
Runtime error
Runtime error
File size: 3,659 Bytes
5e3a6e4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
import time
from typing import Dict
import streamlit as st
from hydralit import HydraHeadApp
class LoginApp(HydraHeadApp):
"""
This is an example login application to be used to secure access within a HydraApp streamlit application.
This application implementation uses the allow_access session variable and uses the do_redirect method if the login check is successful.
"""
def __init__(self, title = '', **kwargs):
self.__dict__.update(kwargs)
self.title = title
def run(self) -> None:
"""
Application entry point.
"""
st.markdown("<h1 style='text-align: center;'>Secure Hydralit Login</h1>", unsafe_allow_html=True)
c1,c2,c3, = st.columns([2,2,2])
c3.image("./resources/lock.png",width=100,)
c3.image("./resources/hydra.png",width=100,)
form_data = self._create_login_form(c2)
pretty_btn = """
<style>
div[class="row-widget stButton"] > button {
width: 100%;
}
</style>
<br><br>
"""
c2.markdown(pretty_btn,unsafe_allow_html=True)
if form_data['submitted']:
self._do_login(form_data, c2)
def _create_login_form(self, parent_container) -> Dict:
login_form = parent_container.form(key="login_form")
form_state = {}
form_state['username'] = login_form.text_input('Username')
form_state['password'] = login_form.text_input('Password',type="password")
form_state['access_level'] = login_form.selectbox('Example Access Level',(1,2))
form_state['submitted'] = login_form.form_submit_button('Login')
parent_container.write("sample login -> joe & joe")
if parent_container.button('Guest Login',key='guestbtn'):
# set access level to a negative number to allow a kick to the unsecure_app set in the parent
self.set_access(1, 'guest')
self.do_redirect()
if parent_container.button('Sign Up',key='signupbtn'):
# set access level to a negative number to allow a kick to the unsecure_app set in the parent
self.set_access(-1, 'guest')
#Do the kick to the signup app
self.do_redirect()
return form_state
def _do_login(self, form_data, msg_container) -> None:
#access_level=0 Access denied!
access_level = self._check_login(form_data)
if access_level > 0:
msg_container.success(f"✔️ Login success")
with st.spinner("🤓 now redirecting to application...."):
time.sleep(1)
#access control uses an int value to allow for levels of permission that can be set for each user, this can then be checked within each app seperately.
self.set_access(form_data['access_level'], form_data['username'])
#Do the kick to the home page
self.do_redirect()
else:
self.session_state.allow_access = 0
self.session_state.current_user = None
msg_container.error(f"❌ Login unsuccessful, 😕 please check your username and password and try again.")
def _check_login(self, login_data) -> int:
#this method returns a value indicating the success of verifying the login details provided and the permission level, 1 for default access, 0 no access etc.
if login_data['username'] == 'joe' and login_data['password'] == 'joe':
return 1
else:
return 0 |