• 21-01-2024, 04:31:14
    #1
    Merhabalar.

    Bir portfolio projesi üzerinde çalışıyorum. Bugün aldığım hatayı anlayamıyorum.
    Örneğin sitede Company ve Worker Üyelik var.
    Şirket ve Normal tip üyeliklerin kayıtlarında , database kısmında problem yok.
    Sorunum şu:
    A şirket parolası 123456 olsun.
    Daha sonra bir Worker oluşturduğumda şifre 123456 olursa, login yaparken Worker Email & Password giriyorum, otomatik olarak A şirketinin profili renderlanıyor.Bu da kabul edilemez bir güvenlik açığı tabii ki.
    Yani current_user .is_authenticated Company olarak renderlanıyor.
    Bir türlü çözüm bulamadım. Farklı kodlar yazdım ancak işin içinden çıkamıyorum.
    Yardımcı olabilir misiniz?

    Bu üyelik modellerimi şu şekilde tanımladım:
    class Company(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        company_name = db.Column(db.String(100), nullable=False)
        company_detail = db.Column(db.Text, nullable=True)
        company_photo = db.Column(db.String(255), default='default.jpg') 
        company_email = db.Column(db.String(120), unique=True, nullable=False)
        password = db.Column(db.String(60), nullable=False)
        # Establishing a one-to-many relationship with JobListing
        joblistings = db.relationship('JobListing', backref='company', lazy=True)
        def __repr__(self):
            return f"Company('{self.company_name}', '{self.company_email}' , '{self.company_detail}' , '{self.password}')"
    class JobListing(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(100), nullable=False)
        content = db.Column(db.Text, nullable=True)
        job_type = db.Column(db.String(50), nullable=True,default="Full Time")
        location = db.Column(db.String(100), nullable=True)
        posted_time = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
        # Establishing a many-to-one relationship with Company
        company_id = db.Column(db.Integer, db.ForeignKey('company.id'), nullable=False)
        def __repr__(self):
            return f"JobListing('{self.title}', '{self.location}', '{self.posted_time}')"
        
    class Worker(db.Model , UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        worker_fullname=db.Column(db.String(60),nullable=False,default="Anonim")
        worker_email = db.Column(db.String(120), unique=True, nullable=False)
        password = db.Column(db.String(60), nullable=False)
        profile_photo = db.Column(db.String(255))  
        about = db.Column(db.Text)
        def __repr__(self):
            return f"Worker('{self.worker_fullname}','{self.worker_email}' , '{self.password}')"
    Login Routing şu şekilde:
    @user.route("/login" , methods=['GET', 'POST'])
    def login():
        form = LoginForm()
        if current_user.is_authenticated:
            return redirect(url_for('main.home'))
        if form.validate_on_submit():
            company_user = Company.query.filter_by(company_email=form.email.data).first()
            if company_user is None:
                user = Worker.query.filter_by(worker_email=form.email.data).first()
            else:
                user = company_user
            if user and bcrypt.check_password_hash(user.password, form.password.data):
                login_user(user)
                flash('Login successful!', 'success')
                print(user)
                next_page = request.args.get('next')
                return redirect(next_page) if next_page else redirect(url_for('main.home'))
            else:
                flash('Login Unsuccessful. Please check username and password', 'danger')
                print(user)
        return render_template('login.html', title="Login", form=form)
  • 21-01-2024, 04:40:59
    #2
    Sorun çözüldü :

    @login_manager.user_loader kısmında worker tanımlamasını yapmamışım.