用新的AuthManager替换AuthPlugin的实现

时间:2017-05-19 10:44:13

标签: php authentication mediawiki

我的问题,指南和文件有点复杂和令人困惑。 它仅设置"实现[ClassName]",但没有显示示例。

我的代码(必须重写的旧代码)如下:

class MyAuthPlugin extends AuthPlugin {

  protected $isAuthenticated = false;

  function modifyUITemplate( &$template ) {
      $template->set( 'usedomain', false );
      $template->set( 'useemail',  false ); 
      $template->set( 'canreset',  false );
      $template->set( 'create',    false );
  }


  function autoCreate() {
      return true;
  }

  function userExists( $username ) {  
      return true;  //already handled in ohter function
  }

  function strict() {   
      return true;  
  }

  /* Being called twice:
   * Login->attemptAutoCreate() (SpecialUserLogin.php) (only for new)
   * User->checkPassword() (User.php) external PW-authentication.  
   */   
  function authenticate( $username, $password ) {
      global $BBredirect, $BBconnection, $wgRequest;

      if($this->isAuthenticated) return true;

      $BBConnection['Parameters']  = 'cmd=authenticate&sessionId='.$wgRequest->getVal('sessionId');

      $myRequest = new SimpleHttpRequest($BBConnection);
      $responseGET = $myRequest->doRequest(SimpleHttpRequest::HTTP_GET);
      echo ($responseGET[Content]);

      $auth = simplexml_load_string($responseGET[Content]);

      if($auth->response->authentication ==  'false') {
          return false;
      }

      if($auth->response->authentication == 'ok') {
          $this->isAuthenticated = true;
      }
      return $this->isAuthenticated;
  }

  function isAuthenticated() {
      return $this->isAuthenticated;
  }

}

如何将此代码转换为新的AuthManager样式? 这guide提出了很多不同的类......

  • userExists()→PrimaryAuthenticationProvider :: testUserExists()

  • authenticate()→PrimaryAuthenticationProvider :: beginPrimaryAuthentication + PasswordAuthenticationRequest(如何将密码传递给流程?)

  • modifyUITemplate()→AuthenticationProvider中的AuthenticationRequests(如何?)+ AuthChangeFormFields hook。
  • autoCreate()没有直接替换。 (AuthenticationResponse-> from where?只想强制自动创建)
  • strict()→不要返回ABSTAIN(我该怎么办?不想进行本地身份验证)
  • 如何实例化我的课程?与$wgAuth = new MyAuthPLugin() 不推荐使用文件。

或者,当在html-Request中给出用户名,密码(哈希),sessionID和密钥时,是否有一种简单的自动登录方式?

1 个答案:

答案 0 :(得分:1)

你需要:

  • 创建AbstractPrimaryAuthenticationProvider子类
  • 实施getAuthenticationRequests;你可能想要在PasswordAuthenticationRequest上返回一个新的ACTION_LOGIN对象,否则就没有了(因为你不想支持创建BB用户/通过wiki更改他们的密码)。
  • 实施beginPrimaryAuthentication;它将与旧authenticate大致相同,除了您将凭据作为AuthenticationRequest个对象的数组获取并使用AuthenticationRequest::getRequestByClass( $reqs, PasswordAuthenticationRequest::class )来获取正确的对象,然后返回AuthenticationResponse::newXXX表示结果(newPassnewFail - 没有弃权,因为您不想支持退回到另一种身份验证方法)。如果用户不在本地,则自动创建是自动生成的。
  • 实施testUserExists。这应该在BB数据库中查找用户。 (只是一直返回true或false也可能会起作用 - 这主要是因为提供者可以保留名称并阻止其他提供者接受它。)
  • 实施beginPrimaryAccountCreationaccountCreationType。由于您可能不希望通过Wiki支持BB帐户创建,因此只需分别返回AuthenticationResponse::newFailTYPE_NONE
  • 实施providerAllowsAuthenticationDataChangeproviderChangeAuthenticationData。第一个应该在收到密码验证请求时返回错误,否则忽略它。第二个应该是空的。