[Flask] Autenticação de usuário com Flask-Security

No Flask, temos diversos pacotes/libs que nos ajudam a agilizar o desenvolvimento. Em geral, a maioria das aplicações precisam de autenticação de usuário, para fins diversos, tanto para limitar e delegar acessos e permissões.

Para nossa alegria, alguém fez um santo trabalho e reuniu diversas libs do flask que permitem fazer toda a parte de autenticação em uma só, e adicionou alguns recursos interessantes, o nome dessa lib é Flask-Security.

Para instalar o flask-security basta executar o comando abaixo, que ele irá instalar tanto o Flask-Security quanto suas dependências.

pip install flask-security

O Flask-Security precisa de apenas dois models, chamados User e Roles, que vão definir as estruturas de Usuários e permissões respectivamente.

A documentação oficial recomenda a estrutura de model base abaixo, portanto criamos um arquivo chamado model.py e adicionamos o conteúdo abaixo:

from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import Security, SQLAlchemyUserDatastore, \
    UserMixin, RoleMixin, login_required

from database import db

roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

Criamos também um arquivo chamado database.py, com apenas esse código.

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

EU prefiro dessa forma para evitar referências circulares.

Agora criaremos um arquivo chamado app.py, que será entry point da nossa aplicação, ou seja será o arquivo que vai ser executado pelo interpretador python.

from flask import Flask
from database import db
from models import User, Role
from flask_security import Security, SQLAlchemyUserDatastore

app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'

# Configuracao para nao enviar email no registro de novos usuarios
app.config['SECURITY_SEND_REGISTER_EMAIL'] = False
# Necessario para habilitar o registro de novos usuarios
app.config['SECURITY_REGISTERABLE'] = True

# Inicializa a instancia do banco dentro do contexto da aplicacao
db.init_app(app)

# A classe SQLAlchemyUserDatastore implementa os metodos necessarios para CRUD de usuarios e permissoes
user_datastore = SQLAlchemyUserDatastore(db, User, Role)

# Finalmente inicializa o package security passando contexto de aplicacao e instancia de "banco" 
security = Security(app, user_datastore)

if __name__ == "__main__":
    with app.app_context():
        db.create_all()

    app.run(host="0.0.0.0", debug=True, port=8080)

Para iniciar aplicação execute o comando abaixo

python app.py
 * Debugger is active!
 * Debugger pin code: 328-666-259
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

Agora acesse no navegador a url http://localhost:8080/register e visualizará algo semelhante a imagem abaixo.

register

Assim como eu você deve ter achado essa página super mega feia, porem não fique preocupado podemos customizar as views do Flask-Security, porem isso fica para meu próximo post.

Após completar o registro você pode logar no site também, basta acessar http://localhost:8080/login e para efetuar logout http://localhost:8080/logout

O código da postagem está no meu git

Espero que essa postagem seja util, qualquer dúvida ou sugestão basta usar os comentários que estarei todo ouvidos.

Comecei a programar com 15 anos de idade e nunca mais parei.
Programador C# profissionalmente, e Python por opção.
%d blogueiros gostam disto: