Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

limitar acesso adm para maior seguranca

boa tarde,

criei uma rota adm, onde possui um login somente para administradores, para que somente eles poderem entrar na pagina admin(com os dados dos inscritos) ta funcionando ok, o problema e que se algum hacker escrever nomesite/admin ele tem acesso. existe uma forma de eu fazer com que somente as pessoas do adm entrem em admin? não consegui fazer isso direto no admin por isso criei a rota adm, mas pela logica nao adianta nada, estou a muitos dias tentando fazer isso mas não to conseguindo

segue o views

rom flask import render_template, request, redirect, session, flash, url_for from painel import app, db from models import Usuarios from flask_bcrypt import check_password_hash, generate_password_hash

@app.route('/') def index(): return render_template('index.html')

@app.route('/cadastro') def cadastro(): return render_template('cadastro.html')

@app.route('/cadastrar', methods = ["POST"], ) def cadastrar(): nome = request.form ['nome'] sobrenome = request.form ['sobrenome'] cpf = request.form ['cpf'] telefone = request.form ['telefone'] email = request.form ['email'] senha = request.form ['senha']

usuario = Usuarios.query.filter_by(cpf=cpf).first()
senha = generate_password_hash('senha').decode('utf-8')

if usuario:
    flash('Usuario já existente')
    return redirect(url_for('login'))

novo_usuario = Usuarios (nome=nome, sobrenome=sobrenome, cpf=cpf, telefone=telefone, email=email, senha=senha)
db.session.add(novo_usuario)
db.session.commit()
session['usuario_logado'] = True
return redirect(url_for('pagamento'))

@app.route('/pagamento') def pagamento(): return render_template('pagamento.html')

@app.route('/admin') def admin(): usuarios = Usuarios.query.order_by(Usuarios.id) return render_template('admin.html', usuarios = usuarios) #ESSA E A ROTA QUE EU QUERO PROTEGER

@app.route('/editar/int:id') def editar(id): if 'usuario_logado' not in session or session['usuario_logado'] == None: return redirect(url_for('login'))

usuario = Usuarios.query.filter_by(id=id).first()

return render_template('editar.html', usuario=usuario) 

@app.route('/atualizar', methods = ['POST', ]) def atualizar(): usuario = Usuarios.query.filter_by(id=request.form['id']).first()

usuario.nome = request.form ['nome']
usuario.sobrenome = request.form ['sobrenome']
usuario.cpf = request.form ['cpf']
usuario.telefone = request.form ['telefone']
usuario.email = request.form ['email']
usuario.senha = request.form ['senha']

db.session.add(usuario)
db.session.commit()

return redirect(url_for('admin'))

@app.route('/deletar/int:id') def deletar(id): if 'usuario_logado' not in session or session['usuario_logado'] == None: return redirect(url_for('login'))

Usuarios.query.filter_by(id=id).delete()
db.session.commit()
flash('usuario excluido com sucesso')

return redirect(url_for('admin'))

@app.route('/login') def login(): return render_template('login.html')

@app.route('/autenticar', methods = ["POST"], ) def autenticar(): usuario = request.form['usuario'] senha = request.form['senha']

usuario = Usuarios.query.filter_by(email=request.form['usuario']).first()

if not usuario or not check_password_hash(usuario.senha, senha):
        session['usuario_logado'] = usuario.email
        flash(usuario.nome + ' logado com sucesso!')
        return redirect(url_for('dashboard'))
else:
    flash('Usuário não logado.')
    return redirect(url_for('login'))

@app.route('/dashboard') def dashboard(): if 'usuario_logado' not in session or session['usuario_logado'] == None: return redirect(url_for('login')) return render_template('dashboard.html')

@app.route('/logout') def logout(): session['usuario_logado'] = None flash ('Logout efetuado com sucesso') return redirect(url_for('index'))

@app.route('/adm') #aqui tem um login em html so para administradores def adm(): return render_template('adm.html')

@app.route('/acao', methods = ["POST"], ) def acao(): if 'paty@gmail.com' == request.form['usuario'] or 'caio@gmail.com' == request.form['usuario']: #aqui e para pegar so os dois usuarios if 'paty' == request.form['senha'] or 'caio' == request.form['senha']: return redirect(url_for('admin')) else: return redirect(url_for('login'))

2 respostas
solução!

Oi Patricia,

Se você quer restringir o acesso à rota /admin apenas para usuários autenticados como administradores, você pode fazer algumas modificações no seu código.

  1. Em vez de apenas verificar se um usuário está logado para acessar /admin, você também pode verificar se esse usuário tem permissão de administrador.

  2. Mantenha a lógica do login como está, mas na rota /admin, você deve verificar se o usuário logado tem permissões de administrador antes de renderizar a página.

Adicione um campo no seu modelo Usuarios para indicar se um usuário é administrador ou não.

class Usuarios(db.Model):
    # ... outros campos ...
    is_admin = db.Column(db.Boolean, default=False)

Atualiza a lógica de login para definir esse campo:

@app.route('/autenticar', methods=["POST"])
def autenticar():
    # ... seu código atual ...

    if not usuario or not check_password_hash(usuario.senha, senha):
        # ... seu código atual ...
    else:
        session['usuario_logado'] = usuario.email
        if usuario.is_admin:  # Verifica se o usuário é administrador
            flash(usuario.nome + ' logado como administrador!')
            return redirect(url_for('admin'))
        else:
            flash('Usuário não tem permissão de administrador.')
            return redirect(url_for('dashboard'))

Atualiza a rota /admin para verificar se o usuário é administrador:

@app.route('/admin')
def admin():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login'))

    usuario = Usuarios.query.filter_by(email=session['usuario_logado']).first()
    
    if not usuario.is_admin:  # Verifica se o usuário não é administrador
        flash('Acesso negado. Você não é um administrador.')
        return redirect(url_for('dashboard'))

    usuarios = Usuarios.query.order_by(Usuarios.id)
    return render_template('admin.html', usuarios=usuarios)

SÃO as mudanças principais que você precisa fazer. Dessa forma, mesmo que alguém tente acessar diretamente a rota /admin, ele só conseguirá se for um usuário com permissões de administrador.

oi, deus te abençoe porque eu já te abençoei. muito obrigada