国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
首先,我們將創(chuàng)建最重要的類,即驗證符(在我們最佳實踐的AppBundle的安全性/文件夾中)。這是代碼,然后將其解釋:
>我們需要創(chuàng)建的最后一類是處理用戶從symfony登錄時從UserApp.io中登錄用戶的類別。
結(jié)論
>如何將UserApp.io與symfony2集成用于用戶身份驗證?
>將用戶app.io與Symfony2集成用于用戶身份驗證的symfony2涉及幾個步驟。首先,您需要使用Composer安裝UserApp庫。然后,您需要在Symfony2項目中配置UserApp服務。這涉及設置UserApp API密鑰并在Services.yml文件中配置UserApp服務。之后,您可以在控制器中使用UserApp服務對用戶進行身份驗證。
>我如何使用symfony2?
>如何使用Symfony2?
>如何使用userapp.io?
userApp保護我的Symfony2應用程序。 IO提供了許多安全功能,可以幫助您保護Symfony2應用程序。它提供安全的用戶身份驗證,安全的密碼存儲和安全的用戶管理。它還提供了諸如兩因素身份驗證和IP白名單之類的功能,這些功能可以進一步增強您的應用程序的安全性。
>我如何在Symfony2?
首頁 后端開發(fā) php教程 用戶symfony2與userApp.io中的用戶身份驗證

用戶symfony2與userApp.io中的用戶身份驗證

Feb 18, 2025 am 09:47 AM

用戶symfony2與userApp.io中的用戶身份驗證

> UserApp.io是一種方便的用戶管理工具和API。它提供了一個Web界面來處理用戶帳戶(以及這涉及的許多功能)和一個API,將它們吸引到您自己的Web應用程序中。此服務的目的是通過不必在自己的服務器上擔心這一點,使管理用戶身份驗證變得更加容易,更安全。

用戶symfony2與userApp.io中的用戶身份驗證

>它具有許多編程語言和框架的SDK和各種包裝紙,而且價格負擔得起。是的,它帶有一個價格,但是您可以自由地開始使用很多事情要玩。我建議查看他們的功能頁面以獲取更多信息。另外,創(chuàng)建一個帳戶和實驗以創(chuàng)建用戶,在其配置文件中添加屬性等非常容易,因此我建議您還要檢查一下,如果還沒有。

在本文中,我們將研究如何實現(xiàn)利用UserApp.io的Symfony2身份驗證機制。我們編寫的代碼也可以在我創(chuàng)建的這個小庫(當前在開發(fā)中)中找到,您可以嘗試。要將其安裝在您的Symfony應用中,只需按照Github上的說明進行操作即可。

鑰匙要點

    UserApp.io提供了一個全面的用戶管理API,使其更簡單,更安全地處理無需服務器端問題的用戶身份驗證。
  • 通過PHP庫來促進與UserApp.io集成的Symfony2集成,該庫可以通過Composer易于安裝,并且可以在Symfony的服務框架中配置。>
  • >自定義類,例如形式身份驗證者,用戶提供商和注銷處理程序,對于在Symfony2中利用UserApp.io至關(guān)重要,實現(xiàn)了無縫的身份驗證過程。
  • symfony2中的表單Authenticator類處理用戶登錄嘗試,基于UserApp.io的響應創(chuàng)建和身份驗證令牌。>
  • Symfony2中的用戶提供商與用戶App.io進行交互以獲取用戶詳細信息并將其轉(zhuǎn)換為與Symfony兼容的用戶對象,有效地處理角色和權(quán)限。
  • >
  • 登記用戶涉及一個自定義注銷處理程序類,該類與UserApp.io進行交互,以確保還可以從服務中記錄用戶,從而保持跨平臺的一致性。
  • dependecies
  • 為了與UserApp.io服務進行通信,我們將使用其PHP庫。確保您按照其GitHub頁面上的指示在Symfony應用程序的Composer.json文件中需要此。
  • 身份驗證類
>通過我們的Symfony應用來驗證userApp.io用戶,我們將創(chuàng)建一些類:>
  • >一種表單身份驗證者類,用于使用UserApp.io API
  • 執(zhí)行身份驗證
  • >用于代表我們的用戶的自定義用戶類,并從API
  • 中收集的信息
  • >用戶提供商類用于檢索用戶并將其轉(zhuǎn)換為我們用戶類的對象
  • >
  • a代表代表對稱身份驗證令牌
  • 的代幣類
  • >注銷處理程序類,負責從UserApp.io服務中登錄。
  • 如果UserApp.io用戶沒有任何權(quán)限設置(我們將轉(zhuǎn)換為Symfony角色),我們可以投擲一個簡單的異常類別
  • >創(chuàng)建這些類后,我們將其中一些將其聲明為服務,并在Symfony安全系統(tǒng)中使用它們。

形式authenticator

首先,我們將創(chuàng)建最重要的類,即驗證符(在我們最佳實踐的AppBundle的安全性/文件夾中)。這是代碼,然后將其解釋:

>

如您所見,我們正在實現(xiàn)SimpleFormauthenticatorInterface,因此具有3種方法和一個構(gòu)造函數(shù)。后者作為實例化的UserApp.io客戶端(使用服務容器傳遞,但在一分鐘內(nèi)通過此信息)。 當用戶試圖使用應用程序登錄和身份驗證時,Symfony使用了此類。發(fā)生的第一件事是稱為createToken()。此方法需要返回結(jié)合提交的用戶名和密碼的身份驗證令牌。在我們的情況下,這將是我們將在稍后定義的UserAppToken類的一個實例。

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
然后調(diào)用supportToken()方法來檢查此類是否支持createToken()返回的令牌。在這里,我們只是確保我們?yōu)榱钆祁愋头祷亍?p>>

>最后,AuthentIcateToken()被調(diào)用,并嘗試檢查令牌中的憑據(jù)是否有效。在此處,并使用userApp.io php庫,如果失敗,我們嘗試登錄或投擲Symfony身份驗證例外。但是,如果身份驗證成功,則負責的用戶提供商將用于建立我們的用戶對象,然后根據(jù)后者創(chuàng)建和返回另一個令牌對象。

>我們將在快速創(chuàng)建簡單的UserAppToken類后立即編寫我們的用戶提供商。

>令牌類

如您所見,這只是命名更準確的用戶名Passpasswordtoken類的擴展(因為我們存儲一個令牌而不是密碼)。

>用戶提供商

接下來,讓我們看看身份驗證器如何與用戶提供商合作,所以也該創(chuàng)建后者了:

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppToken.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\UsernamePasswordToken</span>;
</span></span><span>
</span><span><span>class UserAppToken extends UsernamePasswordToken {
</span></span><span>
</span><span><span>}</span></span>
>類似于表單Authenticator類,我們使用依賴項注入將UserApp.io客戶端注入此類,并實現(xiàn)了UserProviderInterface。后者需要我們有3種方法:
  • > loaduserbyusername() - 我們現(xiàn)在不需要它,因為我們不需要它
  • >
  • refrreshuser() - 在每個身份驗證的請求
  • 上被調(diào)用
  • supportsClass() - 確定此用戶提供商是否與我們(尚未創(chuàng)建的)用戶類一起工作。
>讓我們回到我們身份驗證符類中的一秒使用其身份驗證令牌從API請求登錄的用戶對象請求。結(jié)果將通過UserFromuserApp()和ExtractrolesFrommissions()助手方法包裹在我們自己的本地用戶應用程序類中。后者是我自己的實施方法,可以將UserApp.io中權(quán)限概念轉(zhuǎn)化為Symfony中的角色。如果未設置用戶的權(quán)限,我們將自己的nouserroleexception丟棄。因此,請確保您的用戶在UserApp.io中具有要映射到Symfony角色的權(quán)限。

異常類是默認php異常的簡單擴展名:

>再次回到我們的身份驗證器,我們看到,如果使用UserApp.io成功驗證,則用戶提供商構(gòu)建了一個用戶提供商,其中包含用戶上的所有必要信息。擁有此對象,我們需要將其添加到UserApptoken類的新實例中并返回。
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>

基本上,這是從用戶試圖登錄的那一刻發(fā)生的:>

我們使用提交的憑據(jù)(createToken())

創(chuàng)建一個令牌
    我們嘗試在此令牌中驗證憑據(jù),如果我們失敗
  1. 我們創(chuàng)建一個包含用戶對象的新令牌和其他信息,如果身份驗證成功
  2. >
  3. 我們返回Symfony然后將其用于將用戶存儲在會話中的代幣。>
  4. 用戶提供商上的RefrReshuser()方法也非常重要。此方法負責檢索每個身份驗證的頁面刷新中當前登錄的用戶的新實例。因此,每當身份驗證的用戶轉(zhuǎn)到防火墻內(nèi)的任何頁面時,此方法就會觸發(fā)。關(guān)鍵是將用戶對象與同時可能發(fā)生的存儲器發(fā)生任何更改進行補充。
  5. 顯然,我們需要將API呼叫保持在最低限度,但這是一個很好的機會,可以通過發(fā)送心跳請求來增加UserApp.io的身份驗證時間。默認情況下(但可配置),每個身份驗證的用戶令牌均有效60分鐘,但是通過發(fā)送心跳請求,將其擴展到20分鐘。
這也是執(zhí)行其他兩個功能的好地方:

  1. 如果令牌同時在UserApp.io中到期,我們會得到一個有價值的例外的Invalid_credentials,因此通過拋出Symfony AuthenticationException,我們也將用戶登錄Symfony。
  2. >盡管使心跳請求變得盡可能便宜(這意味著未檢索實際的用戶數(shù)據(jù)),但用戶鎖定狀態(tài)的確以例外形式回傳遞。因此,我們可以借此機會并標記我們的用戶對象鎖定。然后,可以在應用程序中使用鎖定狀態(tài),例如,通過對其進行檢查并拒絕使用用戶鎖定的各個部分的訪問。
  3. >

如果您需要,可以在此處使用UserApp.io的數(shù)據(jù)更新用戶對象,但我發(fā)現(xiàn)在大多數(shù)用例中,這并沒有多大意義。當用戶下一次注銷并返回時,可以更新數(shù)據(jù)。但是根據(jù)需求,這可以在這里輕松完成。雖然請記住性能的影響和許多API調(diào)用的成本。

基本上,這是我們身份驗證邏輯的關(guān)鍵。

>用戶類

>我們還創(chuàng)建以前一直在談論的UserAppuser類:>

>這里沒有什么特別的,我們只是映射來自UserApp.io的一些數(shù)據(jù)并實現(xiàn)接口所需的一些方法。此外,我們添加了鎖定/解鎖的旗手。
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
>

登錄

>我們需要創(chuàng)建的最后一類是處理用戶從symfony登錄時從UserApp.io中登錄用戶的類別。

>再次在這里注入userApp.io php客戶端,并且由于我們實現(xiàn)了LogouthandlerInterface,因此我們需要具有l(wèi)ogout()方法。我們要做的就是從UserApp.io登錄用戶。
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppToken.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\UsernamePasswordToken</span>;
</span></span><span>
</span><span><span>class UserAppToken extends UsernamePasswordToken {
</span></span><span>
</span><span><span>}</span></span>
將所有內(nèi)容接線

>現(xiàn)在我們有了我們的課程,現(xiàn)在該將它們聲明為服務并在我們的身份驗證系統(tǒng)中使用。這是我們的基于YML的服務聲明:

第一個是我們以參數(shù)的引用形式在應用程序ID中傳遞給我們的應用ID的UserApp.io PHP庫。您需要使用UserApp.io應用ID的參數(shù)稱為userApp_id。

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppProvider.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\UsernameNotFoundException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\UnsupportedUserException</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span><span>use AppBundle<span>\Security\Exception\NoUserRoleException</span>;
</span></span><span><span>use AppBundle<span>\Security\UserAppUser</span>;
</span></span><span>
</span><span><span>class UserAppProvider implements UserProviderInterface
</span></span><span><span>{
</span></span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function loadUserByUsername($username)
</span></span><span>  <span>{
</span></span><span>    <span>// Empty for now
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function refreshUser(UserInterface $user)
</span></span><span>  <span>{
</span></span><span>    <span>if (!$user instanceof UserAppUser) {
</span></span><span>      <span>throw new UnsupportedUserException(
</span></span><span>        <span>sprintf('Instances of "%s" are not supported.', get_class($user))
</span></span><span>      <span>);
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$api = $this->userAppClient;
</span></span><span>      <span>$api->setOption('token', $user->getToken());
</span></span><span>      <span>$api->token->heartbeat();
</span></span><span>      <span>$user->unlock();
</span></span><span>    <span>}
</span></span><span>    <span>catch (ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_CREDENTIALS') {
</span></span><span>        <span>throw new AuthenticationException('Invalid credentials');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'AUTHORIZATION_USER_LOCKED') {
</span></span><span>        <span>$user->lock();
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $user;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsClass($class)
</span></span><span>  <span>{
</span></span><span>    <span>return $class === 'AppBundle\Security\UserAppUser';
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   *
</span></span><span><span>   * Loads a user from UserApp.io based on a successful login response.
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $login
</span></span></span><span><span>   * <span>@return UserAppUser
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>public function loadUserByLoginInfo($login) {
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$api = $this->userAppClient;
</span></span><span>      <span>$api->setOption('token', $login->token);
</span></span><span>      <span>$users = $api->user->get();
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_USER_ID') {
</span></span><span>        <span>throw new UsernameNotFoundException(sprintf('User with the id "%s" not found.', $login->user_id));
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>if (!empty($users)) {
</span></span><span>      <span>return $this->userFromUserApp($users[0], $login->token);
</span></span><span>    <span>}
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * Creates a UserAppUser from a user response from UserApp.io
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $user
</span></span></span><span><span>   * <span>@param $token
</span></span></span><span><span>   * <span>@return UserAppUser
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>private function userFromUserApp($user, $token) {
</span></span><span>
</span><span>    <span>$roles = $this->extractRolesFromPermissions($user);
</span></span><span>
</span><span>    <span>$options = array(
</span></span><span>      <span>'id' => $user->user_id,
</span></span><span>      <span>'username' => $user->login,
</span></span><span>      <span>'token' => $token,
</span></span><span>      <span>'firstName' => $user->first_name,
</span></span><span>      <span>'lastName' => $user->last_name,
</span></span><span>      <span>'email' => $user->email,
</span></span><span>      <span>'roles' => $roles,
</span></span><span>      <span>'properties' => $user->properties,
</span></span><span>      <span>'features' => $user->features,
</span></span><span>      <span>'permissions' => $user->permissions,
</span></span><span>      <span>'created' => $user->created_at,
</span></span><span>      <span>'locked' => !empty($user->locks),
</span></span><span>      <span>'last_logged_in' => $user->last_login_at,
</span></span><span>      <span>'last_heartbeat' => time(),
</span></span><span>    <span>);
</span></span><span>
</span><span>    <span>return new UserAppUser($options);  
</span></span><span> <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * Extracts the roles from the permissions list of a user
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $user
</span></span></span><span><span>   * <span>@return <span>array</span>
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>private function extractRolesFromPermissions($user) {
</span></span><span>    <span>$permissions = get_object_vars($user->permissions);
</span></span><span>    <span>if (empty($permissions)) {
</span></span><span>      <span>throw new NoUserRoleException('There are no roles set up for your users.');
</span></span><span>    <span>}
</span></span><span>    <span>$roles = array();
</span></span><span>    <span>foreach ($permissions as $role => $permission) {
</span></span><span>      <span>if ($permission->value === TRUE) {
</span></span><span>        <span>$roles[] = $role;
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>if (empty($roles)) {
</span></span><span>      <span>throw new NoUserRoleException('This user has no roles enabled.');
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $roles;
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
>其他三個是我們之前寫過的表單身份驗證者,用戶提供商和注銷類。如您所記得的那樣,每個人都以定義為第一個服務的UserApp.io客戶端的形式接受其構(gòu)造函數(shù)中的一個參數(shù)。

接下來,是時候在我們的安全系統(tǒng)中使用這些服務了,因此編輯Security.yml文件并執(zhí)行以下操作:>

在提供者密鑰下

,添加以下內(nèi)容:

    在這里,我們指定我們的應用程序也具有此用戶提供商,因此可以使用它。
  1. >

    在防火墻鑰匙下,添加以下內(nèi)容:>

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>

>這里發(fā)生的事情是,我們定義了一個簡單的安全區(qū)域,該區(qū)域使用Authenticator使用Simple_form類型的身份驗證。在注銷密鑰下,我們添加了要調(diào)用的處理程序(我們的UserAppLogout類定義為服務)。其余的是常規(guī)的Symfony安全設置,因此請確保您確實在登錄路線上顯示登錄表單,等等。請查看有關(guān)此信息的文檔,以獲取更多信息。

>僅此而已。通過使用我們的自定義表單身份驗證器和用戶提供商(以及可選的注銷處理程序),使用Simple_form身份驗證,我們已經(jīng)實現(xiàn)了基于UserApp.io的Symfony Symfony身份驗證機制。

結(jié)論

在本文中,我們看到了如何使用UserApp.io服務和API作為用戶提供商實現(xiàn)自定義符號表單身份驗證。我們已經(jīng)完成了很多代碼,這意味著對代碼本身的簡短說明。相反,我試圖通過構(gòu)建一種自定義解決方案來考慮與UserApp.io交互的方式來解釋與Symfony的身份驗證過程。

>如果您跟隨并在捆綁包中實現(xiàn)了此方法并希望這樣使用,請繼續(xù)。您還可以選擇使用我創(chuàng)建的庫,該庫在GitHub頁面上具有非常簡單的設置。我推薦后者,因為我計劃開發(fā)和維護它,以便如果刪除任何錯誤或引入了功能(希望不是相反),您始終可以獲取更新版本。

如果您想為此做出貢獻,您非常歡迎。我也很感謝讓我知道您是否發(fā)現(xiàn)任何問題或認為有更好的方法可以實現(xiàn)類似的目標。

symfony2和userApp.io

>的經(jīng)常詢問的問題(常見問題解答)

>如何將UserApp.io與symfony2集成用于用戶身份驗證?

>將用戶app.io與Symfony2集成用于用戶身份驗證的symfony2涉及幾個步驟。首先,您需要使用Composer安裝UserApp庫。然后,您需要在Symfony2項目中配置UserApp服務。這涉及設置UserApp API密鑰并在Services.yml文件中配置UserApp服務。之后,您可以在控制器中使用UserApp服務對用戶進行身份驗證。

>

>在Symfony2?>我如何在Symfony2?

userApp.io中使用UserApp.io來處理用戶角色和權(quán)限,提供了一個稱為“用戶角色”的功能,該功能允許您管理用戶角色和權(quán)限。您可以定義不同的角色并將其分配給用戶。然后,您可以檢查用戶在Symfony2 Controller中的角色,以控制對應用程序不同部分的訪問。

>

>我如何使用symfony2?

userapp.io in userapp.io處理用戶注冊。提供了一個稱為“用戶注冊”的功能,該功能允許您在Symfony2應用程序中處理用戶注冊。您可以在控制器中使用UserApp服務來注冊新用戶。 UserApp服務將處理注冊過程,包括驗證用戶的電子郵件和密碼,以及創(chuàng)建新的用戶帳戶。

>如何使用Symfony2?

??userApp中的userApp.io處理密碼重置.IO提供了一個稱為“密碼重置”的功能,該功能允許您在Symfony2應用程序中處理密碼重置。您可以在控制器中使用UserApp服務來重置用戶的密碼。 USERAPP服務將處理密碼重置過程,包括向用戶發(fā)送密碼重置電子郵件。

>

>如何使用symfony2?

userapp.io提供用戶身份驗證錯誤。一個稱為“錯誤處理”的功能,可讓您在Symfony2應用程序中處理用戶身份驗證錯誤。您可以在控制器中使用UserApp服務來捕獲和處理身份驗證錯誤。 UserApp服務將提供詳細的錯誤消息,您可以使用這些消息來調(diào)試和修復身份驗證問題。

>

>如何使用symfony2?

userApp.io提供的用戶身份驗證過程來自定義用戶身份驗證過程。用戶身份驗證過程的許多自定義選項。您可以自定義登錄表,注冊表格,密碼重置表格等。您還可以通過將自定義字段添加到用戶配置文件中,或通過實現(xiàn)自定義身份驗證邏輯來??自定義用戶身份驗證過程。

>如何使用userapp.io?

userApp保護我的Symfony2應用程序。 IO提供了許多安全功能,可以幫助您保護Symfony2應用程序。它提供安全的用戶身份驗證,安全的密碼存儲和安全的用戶管理。它還提供了諸如兩因素身份驗證和IP白名單之類的功能,這些功能可以進一步增強您的應用程序的安全性。

>

>如何將現(xiàn)有的用戶數(shù)據(jù)遷移到Symfony2?

userApp中的UserApp.io中.IO提供了一個稱為“數(shù)據(jù)遷移”的功能,該功能使您可以將現(xiàn)有用戶數(shù)據(jù)遷移到UserApp.io。您可以使用UserApp API將現(xiàn)有用戶數(shù)據(jù)導入UserApp.io。 UserApp API提供了許多端點,您可以用來導入用戶數(shù)據(jù),包括用戶配置文件,用戶角色和用戶權(quán)限。

>我如何在Symfony2?

> userApp.io中與userApp.io進行故障排除,提供了許多故障排除工具,這些工具可以幫助您在Symfony2中與UserApp.io進行故障排除問題。它提供詳細的錯誤消息,記錄和調(diào)試工具。您還可以使用UserApp API來解決用戶應用服務問題的問題。 USERAPP API提供了許多端點,您可以使用這些端點來調(diào)試和解決用戶應用服務的問題。

以上是用戶symfony2與userApp.io中的用戶身份驗證的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

對基于PHP的API進行版本控制的最佳實踐是什么? 對基于PHP的API進行版本控制的最佳實踐是什么? Jun 14, 2025 am 12:27 AM

基于toversionaphp,useUrl deuseUrl specteringforclarityAndEsofRouting,單獨的codetoavoidConflicts,dremecateOldVersionswithClearCommunication,andConsiderCustomHeadeSerlySerallyWhennEnncelsy.startbyplacingtheversionIntheUrl(E.G.,epi/api/v

如何在PHP中實施身份驗證和授權(quán)? 如何在PHP中實施身份驗證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

PHP中有哪些弱參考(弱圖),何時有用? PHP中有哪些弱參考(弱圖),何時有用? Jun 14, 2025 am 12:25 AM

PHPdoesnothaveabuilt-inWeakMapbutoffersWeakReferenceforsimilarfunctionality.1.WeakReferenceallowsholdingreferenceswithoutpreventinggarbagecollection.2.Itisusefulforcaching,eventlisteners,andmetadatawithoutaffectingobjectlifecycles.3.YoucansimulateaWe

PHP中的程序和面向?qū)ο蟮木幊谭独g有什么區(qū)別? PHP中的程序和面向?qū)ο蟮木幊谭独g有什么區(qū)別? Jun 14, 2025 am 12:25 AM

procemal and object-tiriendedprogromming(oop)inphpdiffersimplessintustructure,可重復使用性和datahandling.1.procedural-Progrogursmingusesfunctimesfunctionsormanized sequalized sequalized sequiential,poiperforsmallscripts.2.OpporganizesCodeOrganizescodeOdeIntsocloceSandObjects,ModelingReal-Worlden-Worlden

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴格程度。==在比較前會進行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用于變量,字符串數(shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結(jié)果可能是浮點數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負數(shù)時余數(shù)符號與被除數(shù)一致。正確使用這些運算符的關(guān)鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

See all articles