Skip to content

User creation in Fab fails when no role specified #59963

@jscheffl

Description

@jscheffl

Apache Airflow version

3.1.5

If "Other Airflow 3 version" selected, which one?

No response

What happened?

While testing providers release on 2025-12-30 I noticed that when attempting to create a User in Fab and I miss to set the "Role" field I get a Ooops / HTTP 500 screen:

Image (see Role field is empty) Image

If a Role is selected it is working.

Stack trace from API Server:

2025-12-31T11:17:07.982595Z [error    ] Exception on /users/add [POST] [airflow.providers.fab.www.app] loc=app.py:1744
Traceback (most recent call last):
  File "/usr/python/lib/python3.12/site-packages/flask/app.py", line 2529, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/flask/app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/flask/app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/flask_appbuilder/security/decorators.py", line 151, in wraps
    return f(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/flask_appbuilder/views.py", line 237, in add
    widget = self._add()
             ^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/flask_appbuilder/baseviews.py", line 1241, in _add
    if form.validate():
       ^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/wtforms/form.py", line 330, in validate
    return super().validate(extra)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/wtforms/form.py", line 147, in validate
    if not field.validate(self, extra):
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/wtforms/fields/core.py", line 234, in validate
    stop_validation = self._run_validation_chain(form, chain)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/wtforms/fields/core.py", line 254, in _run_validation_chain
    validator(form, self)
  File "/usr/python/lib/python3.12/site-packages/flask_appbuilder/security/forms.py", line 25, in roles_or_groups_required
    if not form["roles"].data and not form["groups"].data:
                                      ~~~~^^^^^^^^^^
  File "/usr/python/lib/python3.12/site-packages/wtforms/form.py", line 64, in __getitem__
    return self._fields[name]
           ~~~~~~~~~~~~^^^^^^
KeyError: 'groups'

What you think should happen instead?

Same like in Fab as released with Airflow 3.1.5 there should be a validation error generated, not a HTTP 500:

Image

How to reproduce

Use Fab apache-airflow-providers-fab==3.1.1rc1 or start on latest main via breeze start-airflow --python 3.12 --load-example-dags --backend postgres --executor LocalExecutor --answer y --auth-manager FabAuthManager

Log in as admin and go to Security->Users, add a user and miss-out to fill the "Roles" field.

Operating System

Linux

Versions of Apache Airflow Providers

Fab 3.1.1rc1 or latest main

Deployment

Other

Deployment details

No response

Anything else?

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Metadata

Metadata

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions