수색…


플라스크 로그인 확장 사용

인증 시스템을 구현하는 간단한 방법 중 하나는 flask-login 확장을 사용하는 것입니다. 프로젝트의 웹 사이트에는 상세하고 잘 작성된 빠른 시작이 포함되어 있으며,이 예제에서는 더 짧은 버전을 사용할 수 있습니다.

일반적인 생각

이 확장은 다음과 같은 용도로 사용되는 함수 집합을 노출합니다.

  • 사용자 로그인
  • 사용자 로깅
  • 사용자가 로그인했는지 여부를 확인하고 어떤 사용자인지 확인

그것이하지 않는 것과 당신 스스로해야 할 일 :

  • 예를 들어 데이터베이스에 사용자를 저장하는 방법을 제공하지 않습니다.
  • 사용자의 자격 증명을 확인하는 방법을 제공하지 않습니다 (예 : 사용자 이름 및 암호).

아래에는 모든 것을 작동시키는 데 필요한 최소 단계가 있습니다.

모든 auth 관련 코드를 별도의 모듈 또는 패키지에 배치하는 것이 좋습니다 (예 : auth.py . 이렇게하면 필요한 클래스, 개체 또는 사용자 지정 함수를 개별적으로 만들 수 있습니다.

LoginManager 작성

Extension은 Flask 응용 프로그램 객체에 등록되어야하는 LoginManager 클래스를 사용합니다.

from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app) # app is a Flask object

앞서 언급했듯이 LoginManager 는 예를 들어 별도의 파일이나 패키지에있는 전역 변수 일 수 있습니다. 그런 다음 Flask 객체가 생성 된 파일이나 응용 프로그램 팩토리 함수에서 가져 와서 초기화 할 수 있습니다.

사용자로드에 사용되는 콜백 지정

사용자는 일반적으로 데이터베이스에서로드됩니다. 콜백은 제공된 ID에 해당하는 사용자를 나타내는 객체를 반환해야합니다. ID가 유효하지 않으면 None 을 리턴해야합니다.

@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id) # Fetch the user from the database

이 작업은 LoginManager 작성 바로 아래에서 수행 할 수 있습니다.

사용자를 나타내는 클래스

앞서 언급했듯이 user_loader 콜백은 사용자를 나타내는 객체를 반환해야합니다. 그게 정확히 무슨 뜻입니까? 이 객체는 예를 들어 데이터베이스에 저장된 사용자 객체를 감싸는 래퍼이거나 데이터베이스의 모델을 직접적으로 나타낼 수 있습니다. 이 객체는 다음 메소드와 속성을 구현해야합니다. 즉, 콜백에서 데이터베이스 모델을 반환하는 경우 위에서 언급 한 속성과 메서드가 모델에 추가되었는지 확인해야합니다.

  • is_authenticated

    이 속성은 사용자가 인증 된 경우, 즉 유효한 자격 증명을 제공 한 경우 True 를 반환합니다. 해당 메소드에 대해 user_loader 콜백에 의해 반환 된 사용자를 나타내는 객체가 True 를 반환하도록해야합니다.

  • is_active

    활성 사용자 인 경우이 속성은 True를 반환해야합니다. 인증 외에도 계정을 활성화했거나 일시 중단하지 않았거나 응용 프로그램에서 계정을 거부 한 상태입니다. 비활성 계정은 로그인 할 수 없습니다. 이러한 메커니즘이 없으면이 메소드에서 True 를 반환하십시오.

  • is_anonymous

    익명 사용자 인 경우이 속성은 True를 반환해야합니다. 즉, user_loader 콜백에 의해 반환 된 사용자 객체가 True 를 반환해야합니다.

  • get_id()

    이 메서드는이 사용자를 고유하게 식별하는 유니 코드를 반환해야하며 user_loader 콜백에서 사용자를로드하는 데 사용할 수 있습니다. 유니 코드 여야합니다. ID가 기본적으로 int 또는 다른 형식 인 경우 유니 코드로 변환해야합니다. user_loader 콜백이 데이터베이스에서 객체를 반환하면이 메소드는이 특정 사용자의 데이터베이스 ID를 반환 할 가능성이 큽니다. 같은 ID로 user_loader 콜백이 나중에 동일한 사용자를 반환하도록해야합니다.

스스로를 더 쉽게 만들고 싶다면 (** 실제로 권장 됨) user_loader 콜백 (아마 데이터베이스 모델)에 의해 반환 된 객체에서 UserMixin 을 상속받을 수 있습니다. 당신은 그 메서드와 속성이 믹스 인에서 기본적으로 구현하는 방법을 볼 수 있습니다 여기에 .

사용자 로그인

확장 프로그램은 사용자가 입력 한 사용자 이름과 암호의 유효성을 귀하에게 남깁니다. 실제로 확장 프로그램은 사용자 이름과 암호 조합 또는 다른 메커니즘을 사용하는지 상관하지 않습니다. 이것은 사용자 이름과 암호를 사용하여 사용자를 로깅하는 예제입니다.

@app.route('/login', methods=['GET', 'POST'])
def login():
    # Here we use a class of some kind to represent and validate our
    # client-side form data. For example, WTForms is a library that will
    # handle this for us, and we use a custom LoginForm to validate.
    form = LoginForm()
    if form.validate_on_submit():
        # Login and validate the user.
        # user should be an instance of your `User` class
        login_user(user)

        flask.flash('Logged in successfully.')

        next = flask.request.args.get('next')
        # is_safe_url should check if the url is safe for redirects.
        # See http://flask.pocoo.org/snippets/62/ for an example.
        if not is_safe_url(next):
            return flask.abort(400)

        return flask.redirect(next or flask.url_for('index'))
    return flask.render_template('login.html', form=form)

일반적으로 로그인 사용자는 login_user 를 호출하고 앞서 언급 한 사용자를 나타내는 객체의 인스턴스를 전달하여 수행됩니다. 표시된 바와 같이 이것은 대개 데이터베이스에서 사용자를 검색하고 자격 증명을 확인한 후에 발생하지만이 예에서는 사용자 개체가 마술처럼 나타납니다.

나는 지금 어떤 사용자로 로그인 했는가?

user_loader 콜백에 의해 반환 된 객체는 여러 가지 방법으로 액세스 할 수 있습니다.

  • 템플릿에서 :

    이 확장은 템플릿 컨텍스트 프로세서를 사용하여 current_user 라는 이름으로 자동으로 삽입합니다. 이 동작을 비활성화하고 사용자 정의 프로세서를 사용하려면 LoginManager 생성자에서 add_context_processor=False 로 설정하십시오.

      {% if current_user.is_authenticated %}
        Hi {{ current_user.name }}!
      {% endif %}
    
  • 파이썬 코드 :

    확장은 current_user 라는 요청 - 바운드 객체를 제공합니다.

      from flask_login import current_user    
    
      @app.route("/hello")
      def hello():
          # Assuming that there is a name property on your user object
          # returned by the callback
          if current_user.is_authenticated:
              return 'Hello %s!' % current_user.name 
          else:
              return 'You are not logged in!'
    
  • 데코레이터를 사용하여 신속하게 액세스 제한 login_required 데코레이터는 액세스를 빠르게 제한하는 데 사용할 수 있습니다.

      from flask_login import login_required
    
      @app.route("/settings")
      @login_required
      def settings():
          pass
    

사용자 로깅

사용자는 logout_user() 를 호출하여 로그 아웃 할 수 있습니다. 사용자가 로그인하지 않아도 @login_required 데코레이터가 @login_required 될 가능성이 높습니다.

@app.route("/logout")
@login_required
def logout():
    logout_user()
    return redirect(somewhere)

사용자가 로그인되어 있지 않고 current_user 객체에 액세스하면 어떻게됩니까?

defult에 의해 AnonymousUserMixin 이 반환됩니다.

  • is_activeis_authenticatedFalse
  • is_anonymousTrue
  • get_id()None 반환합니다.

익명 사용자에 대해 다른 객체를 사용하려면 다음을 사용하여 LoginManager 익명 사용자를 만드는 호출 가능 클래스 (클래스 또는 팩토리 함수)를 제공하십시오.

login_manager.anonymous_user = MyAnonymousUser

다음은?

이것으로 확장에 대한 기본적인 소개를 마칩니다. 구성 및 추가 옵션에 대해 자세히 알아 보려면 공식 가이드읽는 것이 좋습니다.

로그인 세션 시간 초과

특정 시간 후에 세션에 로그인하면 시간 초과가되는 것이 좋습니다. Flask-Login을 사용하면이를 달성 할 수 있습니다.

from flask import Flask, session
from datetime import timedelta
from flask_login import LoginManager, login_require, login_user, logout_user

# Create Flask application

app = Flask(__name__) 

# Define Flask-login configuration 

login_mgr = LoginManager(app)
login_mgr.login_view = 'login'
login_mgr.refresh_view = 'relogin'
login_mgr.needs_refresh_message = (u"Session timedout, please re-login")
login_mgr.needs_refresh_message_category = "info"


@app.before_request
def before_request():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=5)

기본 세션 수명은 31 일이며 사용자는 시간 초과가 발생할 경우 로그인 새로 고침보기를 지정해야합니다.

app.permanent_session_lifetime = timedelta(minutes=5)

위 행은 사용자가 매 5 분마다 다시 로그인하도록합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow