반응형

관리자 페이지 또는 필요에 따라 로그인 2차인증이 필요할 경우가 있다.

구글에서 제공하는 TOTP 기반의 google authenticator 앱으로 무료로 사용할 수가 있다.

여기서 TOTP와 2-factor 인증 방법에 대해 이해가 필요하다.

 

TOTP란?

정의 : 시간 기반 일회용 비밀번호(Time-based one-time password) 현재 시간의 고유성의 원천으로 사용하여 일회용 비밀번호를 생성하는 컴퓨터 알고리즘.

알고리즘 : 사용자가 입력한 otp 코드와 로컬에서 유닉스 시간 기반으로 생성한 코드가 일치 여부를 판단.

                  google authenticator 앱에서는 HOTP 알고리즘으로 인증을 진행.

 

2-factor authentication(2FA)

정의 : 이중인증절차라고 하며 로그인을 시도한 주체가 계정의 실제 소유자인지 확인하여 계정 보안을 높여주는 절차

 

QR코드 생성은 아래 url을 QR코드로 변경하여 표시하면 된다.

 

otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example

Label : Example

User : alice@google.com

secret_key : JBSWY3DPEHPK3PXP

 

위 예시에서 secret_key 는 특정 문자열을 Base32 인코딩한 결과만 Google Authenticator에서 인식된다.

 

google authenticator 앱에 QR 코드로 장치를 등록하는데 해당 QR을 생성하는 예시를 들어주는 사이트 공유

https://dan.hersam.com/tools/gen-qr-code.php

 

Generate QR Codes for Google Authenticator

 

dan.hersam.com

위 사이트에서 QR 만드는 예시를 참고하여 앱 또는 웹 어플리케이션에서 QR을 생성하여 보여주고 인증이 완료된 사용자를 저장하고 해당 사용자에 대해서는 이후 로그인 시도 시 google authenticator 인증 코드를 입력 받을 수 있도록 구현.

반응형
반응형

sqlalchemy는 파이썬에서 DB에 접근하기 위한 ORM 라이브러리다.

 

ORM은 Object Relational Mapping의 약어로써 객체(Object)와 관계형 DB(Relational)을 연결(Mapping) 해주는 것을 의미한다.

객체지향언어에서 객체(클래스)에 DB 테이블을 매핑시켜 사용한다고 생각하면 이해가 쉽다.

ORM은 설계에 따라 사용이 용이할 수도 어려워질 수가 있다.

 

* sqlalchemy

사이트 : https://www.sqlalchemy.org/

 

SQLAlchemy - The Database Toolkit for Python

The Python SQL Toolkit and Object Relational Mapper SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL. It provides a full suite of well known enterprise-level persisten

www.sqlalchemy.org

지원하는 Databases : SQLite, Postresql, MySQL, Oracle, MS-SQL, Firebird, Sybase 등..

사용가능한 Python 버전 : 2.5이후 또는 3.x 버전

 

SQLAlchemy를 사용하기 위해 우선적으로 DB Engine을 생성해야 한다

from sqlalchemy import create_engine
#engine 생성
#password 특수문자 포함 시 password에 url 인코딩 필요
engine = create_engine("postgresql://{username}{password}@{host}/{database}")

#password 인코딩 예시
import urllib.parse
print(urllib.parse.quote_plus("kx@jj5/g")) #'kx%40jj5%2Fg' 출력

from sqlalchemy import URL
#URL을 이용한 engine생성
#password에 특수문자가 포함 시 인코딩 하지 않고 사용할 수 있음.
url_object = URL.create(
	drivername="",
    username={username},
    password={password},
    host={host},
    database={database},
    query={"charset":"cp949"}
    )
engine = create_engine(url_object)

위와 같이 생성한다.

 

* 각 DB별 engine 생성 샘플

# mysql default
engine = create_engine("mysql://scott:tiger@localhost/foo")

# mysqlclient (a maintained fork of MySQL-Python)
engine = create_engine("mysql+mysqldb://scott:tiger@localhost/foo")

# PyMySQL
engine = create_engine("mysql+pymysql://scott:tiger@localhost/foo")

#Oracle
engine = create_engine("oracle://scott:tiger@127.0.0.1:1521/sidname")
engine = create_engine("oracle+cx_oracle://scott:tiger@tnsname")

# mssql pyodbc
engine = create_engine("mssql+pyodbc://scott:tiger@mydsn")

# pymssql
engine = create_engine("mssql+pymssql://scott:tiger@hostname:port/dbname")

# sqlite://<nohostname>/<path>
# where <path> is relative:
engine = create_engine("sqlite:///foo.db")

# Unix/Mac - 4 initial slashes in total
engine = create_engine("sqlite:////absolute/path/to/foo.db")

# Windows
engine = create_engine("sqlite:///C:\\path\\to\\foo.db")

# Windows alternative using raw string
engine = create_engine(r"sqlite:///C:\path\to\foo.db")

참고 문서 : https://docs.sqlalchemy.org/en/20/core/engines.html#supported-databases

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[PYTHON] 파이썬 함수 매개변수  (0) 2022.08.11
[Python] flask_restful fields  (0) 2021.10.08
Single Linked list 구현  (0) 2018.03.22
창원시 버스 API 사용하기  (1) 2016.02.22
반응형

Question :

 

You are given a table, Projects, containing three columns: Task_ID, Start_Date and End_Date. It is guaranteed that the difference between the End_Date and the Start_Date is equal to 1 day for each row in the table.

If the End_Date of the tasks are consecutive, then they are part of the same project. Samantha is interested in finding the total number of different projects completed.

Write a query to output the start and end dates of projects listed by the number of days it took to complete the project in ascending order. If there is more than one project that have the same number of completion days, then order by the start date of the project.

Sample Input

Sample Output

2015-10-28 2015-10-29
2015-10-30 2015-10-31
2015-10-13 2015-10-15
2015-10-01 2015-10-04


Explanation

The example describes following four projects:

  • Project 1: Tasks 1, 2 and 3 are completed on consecutive days, so these are part of the project. Thus start date of project is 2015-10-01 and end date is 2015-10-04, so it took 3 days to complete the project.
  • Project 2: Tasks 4 and 5 are completed on consecutive days, so these are part of the project. Thus, the start date of project is 2015-10-13 and end date is 2015-10-15, so it took 2 days to complete the project.
  • Project 3: Only task 6 is part of the project. Thus, the start date of project is 2015-10-28 and end date is 2015-10-29, so it took 1 day to complete the project.
  • Project 4: Only task 7 is part of the project. Thus, the start date of project is 2015-10-30 and end date is 2015-10-31, so it took 1 day to complete the project.

 

Answer :

 

select *
from(
    select MIN(val) as startdate, MAX(val) as enddate
    from(
        (select ROW_NUMBER() over(order by (select End_Date)) as ID, End_Date as val
        from Projects
        where End_Date not in (select Start_Date
        from Projects)

        union all

        select ROW_NUMBER() over(order by (select Start_Date)) as ID, Start_Date as val
        from Projects
        where Start_Date not in (select End_Date
        from Projects))
         ) Y
    group by ID
) Z
order by datediff(dd,startdate,enddate), startdate
반응형

+ Recent posts