[python] SQLAlchemy-Utils를 사용하여 데이터베이스에서 사용자 관리하기

SQLAlchemy는 Python 언어를 위한 SQL 툴킷 및 ORM(Object-Relational Mapping) 라이브러리로 많은 기능을 제공합니다. SQLAlchemy-Utils는 SQLAlchemy를 보완하여 유용한 추가 기능을 제공합니다. 이 글에서는 SQLAlchemy-Utils를 사용하여 데이터베이스에서 사용자 관리 기능을 구현하는 방법을 살펴보겠습니다.

목차

SQLAlchemy-Utils 소개

SQLAlchemy-Utils는 SQLAlchemy ORM을 확장하여 다양한 유틸리티 기능을 제공하는 라이브러리입니다. 사용자 모델을 만들고 관리하는 데 유용한 여러 가지 도구와 기능을 제공합니다.

사용자 모델 만들기

사용자 모델은 사용자의 정보를 저장하고 관리하는 데 사용됩니다. SQLAlchemy-Utils를 사용하여 간단한 사용자 모델을 만들어 보겠습니다.

from sqlalchemy import Column, String
from sqlalchemy_utils import PasswordType
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String, nullable=False, unique=True)
    password = Column(PasswordType(
        schemes=[
            'pbkdf2_sha512',
            'md5_crypt'
        ]
    ))

위의 코드는 SQLAlchemy를 사용하여 간단한 사용자 모델을 정의하고 있습니다.

비밀번호 해싱 및 인증

사용자의 비밀번호를 안전하게 저장하고 인증하는 것은 매우 중요합니다. SQLAlchemy-Utils의 PasswordType을 사용하면 비밀번호를 안전하게 해싱하여 데이터베이스에 저장할 수 있습니다. 또한 사용자가 제공한 비밀번호를 해시된 비밀번호와 비교하여 인증할 수 있습니다.

user = User(username='john_doe', password='mysecretpassword')
session.add(user)
session.commit()

# 사용자 인증
authenticated_user = session.query(User).filter(User.username == 'john_doe').filter(User.password == 'mysecretpassword').first()
if authenticated_user:
    print('사용자 인증 성공')
else:
    print('사용자 인증 실패')

역할 기반 권한 부여

사용자에 대한 역할(role)을 정의하고 이를 기반으로 권한을 관리할 수 있습니다. SQLAlchemy-Utils를 사용하여 역할 기반의 권한 부여를 쉽게 구현할 수 있습니다.

class Role(Base):
    __tablename__ = 'roles'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False, unique=True)

class UserRole(Base):
    __tablename__ = 'user_roles'

    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    role_id = Column(Integer, ForeignKey('roles.id'), primary_key=True)

user = User(username='john_doe', password='mysecretpassword')
user.roles.append(Role(name='admin'))
session.add(user)
session.commit()

# 사용자 권한 확인
if 'admin' in [role.name for role in user.roles]:
    print('관리자 권한이 있습니다')
else:
    print('관리자 권한이 없습니다')

결론

SQLAlchemy-Utils를 사용하여 데이터베이스에서 사용자 관리 기능을 쉽게 구현할 수 있습니다. 비밀번호 해싱, 인증, 역할 기반의 권한 부여 등을 간편하게 구현할 수 있으며, 보안과 권한 관리에 유용한 도구입니다. SQLAlchemy-Utils의 공식 문서와 예제를 참고하여 더 많은 기능을 확인할 수 있습니다.

참고 자료