본문 바로가기
기술자료 (KB)/Python

04. Streamlit으로 AD 로그인 및 자기 정보 가져오기

by 이완주 2024. 8. 1.

 

 

03. Streamlit으로 로그인 페이지와 메인 페이지

02. Streamlit으로 AD 인증 오류 처리하기01. Streamlit으로 AD 인증 페이지 만들기여기서는 Streamlit 기능과 Ldap3 버전을 이용하여 간단하게 인증페이지를 구성해 보았다.  Streamlit 및 python-ldap 설치pip inst

leemcse.tistory.com

 

사용자 계정을 메일형식인 (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()

 

 

 

 

05. Streamlit으로 AD 로그인을 SSL로 인증하기

Active Directory로 Password를 초기화하려면 LDAPS로 인증을 해야 만 한다. Active Directory와 LDAPS(LDAP over SSL) 연결을 설정하려면 서버에 적절한 SSL 인증서가 설치되어 있고, 클라이언트에서 이 인증서를

leemcse.tistory.com

 

댓글