사용자 계정을 메일형식인 (UserPrincipalName:upn)으로 로그인 하고 이름과 설명의 값을 가져와서 화면에 출력하는 내용 입니다.
[결과화면]
[코드설명]
login_page에서 입력받은 server, username, password 값을 session_state 상태에서 값을 지정
로그온시 값을 초기화를 한다.
인증이 성공하면 아래와 같이 true 가 되어 main_page 에 인증정보를 같이 보낸다.
st.session_state['authenticated'] = True
로그아웃 버튼을 눌렀을 때 값 초기화
화면에 현재 로그온한 계정 표시
Active Directory에서 사용자 이름과 설명 값을 가져와서 출력
아래 코드를 수정하면 됩니다.
# 사용자 DN 가져오기
search_base = 'dc=gsoft,dc=local' # 사용하는 Active Directory의 Search_Base DN으로 변경
gsoft.local 이면 DN="dc=gsoft,dc=local " 이렇게 표현한다.
Active Directory 특성 편집기에서 확인이 가능하다.
[소스코드]
import streamlit as st
from ldap3 import Server, Connection, ALL
def authenticate(server, username, password):
try:
# LDAP 서버에 연결
conn = Connection(server, user=username, password=password)
if conn.bind():
return True
else:
return False
except Exception as e:
st.error(f"인증 오류 : {str(e)}")
return False
# main Page 만들기
def main_page(server,username,password):
if st.button('로그아웃'):
st.session_state['authenticated'] = False
st.session_state['server'] = None
st.session_state['username'] = None
st.session_state['password'] = None
# 현재 상태 값을 false로 변경 후 다시 시작하여 화면을 변경함
st.rerun()
st.title('Active Directory 메인 페이지')
st.markdown(f"성공적으로 로그인했습니다.\n\n현재 로그인한 사용자: {username}")
# LDAP 서버에 연결
conn = Connection(server, user=username, password=password)
if conn.bind():
# 사용자 DN 가져오기
search_base = 'dc=gsoft,dc=local' # 사용하는 Active Directory의 Search_Base DN으로 변경
#search_filter = f'(sAMAccountName={username})'
search_filter = f'(UserPrincipalName={username})'
conn.search(search_base, search_filter, attributes=['displayName', 'description'])
if conn.entries:
entry = conn.entries[0]
st.write(f"displayname : {entry.displayName.value}" )
st.write(f"description : {entry.description.value}" )
def login_page():
# Streamlit UI
st.title('Active Directory 로그인 페이지')
username = st.text_input('로그인 ID', placeholder='id@domain.local 형식으로 입력해 주세요.')
password = st.text_input('비밀번호', type='password')
server = st.text_input('서버 이름 혹은 IP 주소')
if st.button('로그인'):
if not username:
st.error("로그인 ID를 입력하세요.")
elif not password:
st.error("비밀번호를 입력하세요.")
elif not server:
st.error("서버 이름 혹은 IP를 입력하세요.")
else:
if authenticate(server, username, password):
st.session_state['authenticated'] = True
st.session_state['server'] = server
st.session_state['username'] = username
st.session_state['password'] = password
# 현재 상태 값을 true로 변경 후 다시 시작하여 화면을 변경함
st.rerun()
else:
st.error('로그인 실패')
# 세션 상태 초기화
if 'authenticated' not in st.session_state:
st.session_state['authenticated'] = False
st.session_state['server'] = None
st.session_state['username'] = None
st.session_state['password'] = None
# 로그인 상태에 따라 페이지 표시
if st.session_state['authenticated']:
main_page(st.session_state['server'],st.session_state['username'],st.session_state['password'])
else:
login_page()
댓글