mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-15 00:05:54 +08:00
Merge branch 'feat/webapp-auth-api' into e-260
This commit is contained in:
commit
5310ed4b54
@ -23,3 +23,9 @@ class AppSuggestedQuestionsAfterAnswerDisabledError(BaseHTTPException):
|
|||||||
error_code = "app_suggested_questions_after_answer_disabled"
|
error_code = "app_suggested_questions_after_answer_disabled"
|
||||||
description = "Function Suggested questions after answer disabled."
|
description = "Function Suggested questions after answer disabled."
|
||||||
code = 403
|
code = 403
|
||||||
|
|
||||||
|
|
||||||
|
class AppAccessDeniedError(BaseHTTPException):
|
||||||
|
error_code = "access_denied"
|
||||||
|
description = "App access denied."
|
||||||
|
code = 403
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
|
import logging
|
||||||
from datetime import UTC, datetime
|
from datetime import UTC, datetime
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from flask import request
|
from flask import request
|
||||||
from flask_login import current_user # type: ignore
|
from flask_login import current_user # type: ignore
|
||||||
from flask_restful import Resource, inputs, marshal_with, reqparse # type: ignore
|
from flask_restful import (Resource, inputs, marshal_with, # type: ignore
|
||||||
|
reqparse)
|
||||||
from sqlalchemy import and_
|
from sqlalchemy import and_
|
||||||
from werkzeug.exceptions import BadRequest, Forbidden, NotFound
|
from werkzeug.exceptions import BadRequest, Forbidden, NotFound
|
||||||
|
|
||||||
from controllers.console import api
|
from controllers.console import api
|
||||||
from controllers.console.explore.wraps import InstalledAppResource
|
from controllers.console.explore.wraps import InstalledAppResource
|
||||||
from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check
|
from controllers.console.wraps import (account_initialization_required,
|
||||||
|
cloud_edition_billing_resource_check)
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from fields.installed_app_fields import installed_app_list_fields
|
from fields.installed_app_fields import installed_app_list_fields
|
||||||
from libs.login import login_required
|
from libs.login import login_required
|
||||||
from models import App, InstalledApp, RecommendedApp
|
from models import App, InstalledApp, RecommendedApp
|
||||||
from services.account_service import TenantService
|
from services.account_service import TenantService
|
||||||
|
from services.app_service import AppService
|
||||||
|
from services.enterprise.enterprise_service import EnterpriseService
|
||||||
|
from services.feature_service import FeatureService
|
||||||
|
|
||||||
|
|
||||||
class InstalledAppsListApi(Resource):
|
class InstalledAppsListApi(Resource):
|
||||||
@ -48,6 +54,23 @@ class InstalledAppsListApi(Resource):
|
|||||||
for installed_app in installed_apps
|
for installed_app in installed_apps
|
||||||
if installed_app.app is not None
|
if installed_app.app is not None
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# filter out apps that user doesn't have access to
|
||||||
|
if FeatureService.get_system_features().webapp_auth.enabled:
|
||||||
|
user_id = current_user.id
|
||||||
|
res = []
|
||||||
|
for installed_app in installed_app_list:
|
||||||
|
app_code = AppService.get_app_code_by_id(str(installed_app["app"].id))
|
||||||
|
if EnterpriseService.WebAppAuth.is_user_allowed_to_access_webapp(
|
||||||
|
user_id=user_id,
|
||||||
|
app_code=app_code,
|
||||||
|
):
|
||||||
|
res.append(installed_app)
|
||||||
|
installed_app_list = res
|
||||||
|
logging.info(
|
||||||
|
f"installed_app_list: {installed_app_list}, user_id: {user_id}"
|
||||||
|
)
|
||||||
|
|
||||||
installed_app_list.sort(
|
installed_app_list.sort(
|
||||||
key=lambda app: (
|
key=lambda app: (
|
||||||
-app["is_pinned"],
|
-app["is_pinned"],
|
||||||
|
@ -5,6 +5,7 @@ from flask_login import current_user # type: ignore
|
|||||||
from flask_restful import Resource # type: ignore
|
from flask_restful import Resource # type: ignore
|
||||||
from werkzeug.exceptions import NotFound
|
from werkzeug.exceptions import NotFound
|
||||||
|
|
||||||
|
from controllers.console.explore.error import AppAccessDeniedError
|
||||||
from controllers.console.wraps import account_initialization_required
|
from controllers.console.wraps import account_initialization_required
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from libs.login import login_required
|
from libs.login import login_required
|
||||||
@ -67,7 +68,7 @@ def user_allowed_to_access_app(view=None):
|
|||||||
)
|
)
|
||||||
logging.info(f"res: {res}")
|
logging.info(f"res: {res}")
|
||||||
if not res:
|
if not res:
|
||||||
raise ValueError("User not allowed to access this app")
|
raise AppAccessDeniedError()
|
||||||
|
|
||||||
return view(installed_app, *args, **kwargs)
|
return view(installed_app, *args, **kwargs)
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ class EnterpriseService:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def batch_get_app_access_mode_by_id(cls, app_ids: list[str]) -> dict[str, WebAppSettings]:
|
def batch_get_app_access_mode_by_id(cls, app_ids: list[str]) -> dict[str, WebAppSettings]:
|
||||||
if not app_ids:
|
if not app_ids:
|
||||||
raise ValueError("app_ids must be provided.")
|
return {}
|
||||||
body = {"appIds": app_ids}
|
body = {"appIds": app_ids}
|
||||||
data: dict[str, str] = EnterpriseRequest.send_request("POST", "/webapp/access-mode/batch/id", json=body)
|
data: dict[str, str] = EnterpriseRequest.send_request("POST", "/webapp/access-mode/batch/id", json=body)
|
||||||
if not data:
|
if not data:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user