微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Flask_Principal 和 Flask-Security 限制用户的访问权限?

如何解决如何使用 Flask_Principal 和 Flask-Security 限制用户的访问权限?

我正在创建一个项目,我想限制用户对 Flask_Principal 的访问?

我正在研究那个,所以...我知道关于那些微框架的事情。

基本上...用户将访问主页,如果他没有登录,他需要进行注册。之后,程序将他发送到登录页面。然后,他需要登录才能访问包含特定消息的主页。

通过登录访问,在主页中,通过特定消息,用户可以点击三个链接(主页、注销、欢迎)。

现在,这就是我的问题。我想为某些无法访问“欢迎”链接用户创建限制访问权限。我如何使用 Flask-Principal 做到这一点?

这是我的 app.py

from projeto import app,db
from flask import Blueprint,render_template,redirect,request,url_for
from flask_login import login_user,login_required,logout_user
from projeto.models import User
from projeto.forms import LoginForm,RegistrationForm


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


@app.route('/welcome')
@login_required
def welcome_user():
    return render_template('welcome_user.html')


@app.route('/logout')
@login_required
def logout():
    logout_user()
    #flash('logout realizado com sucesso!')
    return redirect(url_for('home'))


@app.route('/login',methods=['GET','POST'])
def login():

    form = LoginForm()
    #if form.validate_on_submit():
    if form.validate_on_submit():
        # Grab the user from our User Models table

        user = User.query.filter_by(email=form.email.data).first()
        if user is None or user.password != form.password.data:
            return redirect(url_for('login'))
        #if user.email == form.email.data and user.password == form.password.data:
            #return redirect(url_for('home'))
        login_user(user)
        return redirect(url_for('home'))
    return render_template('login.html',form=form)


@app.route('/register','POST'])
def register():
    form = RegistrationForm()

    if request.method == 'POST':
        user = User(name=form.name.data,address=form.address.data,number=form.number.data,city=form.city.data,state=form.state.data,country_code=form.country_code.data,phone=form.phone.data,email=form.email.data,username=form.username.data,password=form.password.data,#pass_confirm=form.pass_confirm.data
                    pass_confirm=form.password.data)

        db.session.add(user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html',form=form)


if __name__ == '__main__':
    app.run(debug=True)

这是我的init.py

    import os
    from flask import Flask,Blueprint
    from flask_sqlalchemy import sqlAlchemy
    from flask_migrate import Migrate
    from flask_login import LoginManager
    
    #CREATE A LOGIN MANAGER OBJECT
    login_manager = LoginManager()
    
    #CREATE MY APPLICATION
    app = Flask(__name__)
    
    # CREATE MY DATABASE
    app.config['SECRET_KEY'] = 'secret'
    basedir = os.path.abspath(os.path.dirname(__file__))
    app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir,'data.sqlite')
    app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False
    
    #CONfigURATE MY DATABASE WITH THE APP STRUCTURE
    db = sqlAlchemy(app)
    Migrate(app,db)
    
    #Pass in our app to the login MANAGER
    login_manager.init_app(app)
    
    # Tell users what view to go when they need to login_manager
    login_manager.login_view = 'login'

这是我的forms.py

from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField,IntegerField
from wtforms.validators import Datarequired,Email,EqualTo,NumberRange
from wtforms import ValidationError

class LoginForm(FlaskForm):
    email = StringField('Email',validators=[Datarequired(),Email()])
    password = PasswordField('Senha',validators=[Datarequired()])
    submit = SubmitField('Log in')

class RegistrationForm(FlaskForm):
    name = StringField('Nome completo',validators=[Datarequired()])
    address = StringField('Rua',validators=[Datarequired()])
    number = IntegerField('Número',validators=[Datarequired()])
    city = StringField('Cidade',validators=[Datarequired()])
    state = StringField('Estado',validators=[Datarequired()])
    country_code = IntegerField('CEP',validators=[Datarequired()])
    phone = IntegerField('Telefone',validators=[NumberRange(min=0,max=11)])
    email = StringField('Email',Email()])
    username = StringField('Usuário',validators=[Datarequired()])
    password = PasswordField('Senha',EqualTo('pass_confirm',message = 'Passwords Must Match')])
    pass_confirm = PasswordField('Confirme sua senha',EqualTo('password')])
    submit = SubmitField('Cadastrar')

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)


    def check_email(self,field):
        # Check if not None for that user email!
        if User.query.filter_by(email=field.data).first():
            raise ValidationError('Este e-mail já foi regisTrado por um outro usuário!')


    def check_username(self,field):
        #Check if not None for name!
        if User.query.filter_by(usernname=field.data).first():
            raise ValidationError('Este usuário já existe.')


    def check_name(self,field):
        # Check if not None for that username!
        if User.query.filter_by(name=field.data).first():
            raise ValidationError('Este nome já foi regisTrado anteriormente.')

这是我的models.py

from projeto import db,login_manager
from werkzeug.security import generate_password_hash,check_password_hash
from flask_login import UserMixin


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(db.Model,UserMixin):

    # Create a table in the db
    __tablename__ = 'usuario'

    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(70))
    address = db.Column(db.String(120))
    number = db.Column(db.Integer)
    city = db.Column(db.String(150))
    state = db.Column(db.String(20))
    country_code = db.Column(db.Integer)
    phone = db.Column(db.String(11))
    email =db.Column(db.String(64),unique=True,index=True)
    username = db.Column(db.String(64),index=True)
    password = db.Column(db.String(128))
    pass_confirm = db.Column(db.String(128))

    def __init__(self,name,address,number,city,state,country_code,phone,email,username,password,pass_confirm):

        self.name = name
        self.address = address
        self.number = number
        self.city = city
        self.state = state
        self.country_code = country_code
        self.phone = phone
        self.email = email
        self.username = username
        self.password = password
        self.pass_confirm = pass_confirm

这是我的 base.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>
    <Meta charset="utf-8">
    <title>Projeto Voluntário - DOJO</title>
  </head>
  <body>

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <ul class="nav">
      <li class="nav-item">
    <a class="nav-link" href="{{ url_for('home') }}">Página Inicial</a>
  </li>
    {% if current_user.is_authenticated %}
    <li class="nav-link"><a href="{{ url_for('logout') }}">Log Out</a></li>
    <li class="nav-link"><a href="{{ url_for('welcome_user') }}">Welcome</a></li>
    {% else %}
    <li class="nav-link"><a href="{{ url_for('register') }}">Cadastro</a></li>
    <li class="nav-link"><a href="{{ url_for('login') }}">Log In</a></li>

      {%endif%}
    </ul>
    <form class="d-flex">
        <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
        <button class="btn btn-outline-success" type="submit">Buscar</button>
    </form>
</nav>
    {% block content %}

    {% endblock %}


  </body>
</html>

如果有人能帮助我,我将不胜感激。

解决方法

不完全确定你在问什么。首先 - 您的问题询问 Flask_Principle 和 Flask-Security - 但您没有使用 Flask-Security - 包含注册、登录等视图。 Flask-Security 还包含“角色”——它们建立在 Flask-Principle 之上,提供比“认证”更精细的访问控制。

所以 - 这是你的问题吗?一旦用户注册并登录(验证),您是否想要更细粒度地访问各种 API 端点?如果是这样,那么 Flask-Security 可能就是您要寻找的。​​p>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?