laravel - 将 laravel 应用程序与 MS Active Directory 集成,但限制可以访问的用户
问题描述
我有一个供内部使用的自定义应用程序,仅在当前用户由超级管理员创建的情况下使用。一些用户来自企业内部,一些来自外部,例如供应商/客户。
我正在寻找一种将 MS Active Directory 集成为登录选项的方法,但希望能够限制企业中的哪些用户可以实际使用此方法。
我搜索了所有 MS 文档,并拥有有关不同 oauth 方法的所有文档,但不确定哪一个适合我的需要。
我在想,也许我需要给管理员一种浏览 AD 并选择可以登录的用户,然后在 mysql 数据库中创建具有某种 MS 用户 ID 的非活动用户帐户。然后提供一个“使用 MS 登录”按钮,该按钮执行通常的身份验证重定向过程到 MS 并返回到站点。那时我可以检查一个 ID,如果它与允许的用户帐户匹配,如果是,则同步其余数据,例如姓名、电子邮件、电话等。
我已经找到的链接:
https://docs.microsoft.com/en-gb/azure/active-directory/develop/authentication-scenarios
https://docs.microsoft.com/en-gb/graph/tutorials/php
https://github.com/microsoftgraph/msgraph-training-phpapp/tree/master/Demos/03-add-msgraph
解决方案
您的首要任务是让用户能够登录基于 Laravel 的应用程序。为此,我强烈建议不要尝试重新发明轮子(至少不完全),并利用现有的 Laravel 包。Laravel Socialite可能是最好的起点,因为它拥有一长串现有的社区提供的 Socialite 提供商,其中三个已经与 Azure AD 合作:Microsoft、Microsoft-Graph和Microsoft-Azure。(注意:虽然我自己没有测试过这些,但前两个似乎是最有希望的,因为它们使用更新的 v2 端点。)
在授权(控制访问)方面,您有两种选择:
Azure AD 的控制
将应用程序与 Azure AD 集成后,可以在 Azure AD 中配置应用程序以要求用户分配,然后通过分配(或不分配)用户到应用程序来控制对应用程序的访问。未分配的用户甚至无法通过登录页面。
您可以使用 Azure AD 的现有体验来管理应用程序的用户和角色分配,或者您可以全力以赴并将这种体验直接构建到基于 Laravel 的应用程序本身,利用 Azure AD Graph API 来创建 [app角色分配]( https://docs.microsoft.com/en-us/previous-versions/azure/ad/graph/api/entity-and-complex-type-reference#approleassignment-entity和用户选择器体验。
提示:无论哪种情况,请记住,您可以在 Azure AD 中将应用程序“超级用户”设置为应用程序的“所有者”(Azure AD > 企业应用程序 >(应用程序)> 所有者),这将允许他们分配用户而无需授予他们在 Azure AD 中的任何额外权限。
在应用程序上控制
在这种方法中,您允许所有用户使用 Azure AD 登录到应用程序,但随后您使用应用程序自己的授权逻辑来决定谁更进一步,以及他们在应用程序中获得什么角色。
实际上,您很可能会发现最好的方法是结合使用这两者,其中一些授权由 Azure AD 强制执行,下一个级别由应用程序本身强制执行。
推荐阅读
- java - python和java之间发送短信
- php - 如何使用 MAX 函数中的值来确定下一个可用的 id?
- r - 将另一个矩阵的内容(列表内容)放入矩阵的 NULL 位置
- google-bigquery - 在 bigquery 中创建一个非常大的表的 id 的成对组合
- javascript - handlerInput.responseBuilder 在我可以从 observable 获取数据之前返回
- firebase - 使用 Cloud Firestore 和 React 的 Todo App 数据结构
- python - 在Python中查找一列的最大值和最小值以及其他两列的差异
- java - Micronaut MySQL 删除记录 org.hibernate.HibernateException: No Session found for current thread
- angular - 使用 Router.navigate() 后未调用 Observable.subscribe()
- javascript - 几个带有 EventListeners 的按钮,一个不工作