`
haohappy2
  • 浏览: 326535 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

drupal 外部验证登陆

阅读更多

Drupal 6.x 和 5.x 的 HOOK 函数和参数表有很大的差别,所以建议大家多看看 Drupal API手册。后来绕了一大圈发现 Drupal 6.x 的默认模组 (modules) 里面,有一个叫 OpenId 的模组可以实现这个功能。当然,我们的外部身份验证需求通常不唯一的,比如可能是 Discuz! 论坛或者你当前站点的身份验证,制定一个外部身份验证模组正是我们今天的题目解决的问题。

首先我们做开发一个模组的例行工作

exuser.info- (模组信息)

name = External authenticate
description = Allows users to log using external authenticate.
package = Bun Drupal
version = 0.1
core = 6.x

exuser.install- (模组安装脚本)

<?php
/**
* Implementation of hook_install().
*/
function exuser_install() {
  // Create table.
  drupal_install_schema('exuser');
}
 
/**
* Implementation of hook_uninstall().
*/
function exuser_uninstall() {
  // Remove table.
  drupal_uninstall_schema('exuser');
}
 
/**
* Implementation of hook_schema().
*/
function exuser_schema() {
  $schema['exuser_authenticate'] = array(
    'description' => 'Stores eway users',
    'fields' => array(
      'uid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'name' => array(
        'type' => 'char',
        'length' => 11,
        'not null' => TRUE,
      ),
    ),
    'primary key' => array('uid'),
  );
  return $schema;
}

这个脚本告诉 Drupal 安装的时候会生成一个数据表 exuser_authenticate,里面的两个字段是 Drupal 的 uid 和你的身份验证的用户名,因为每个验证用户都需要在 Drupal 的 users 表产生一个用户记录,那么 exuser_authenticate 就是一个对照表

exuser.module- (模组脚本)

<?php
/**
* Implementation of hook_form_alter.
*/
function exuser_form_alter(&$form, $form_state, $form_id)
{
  if ($form_id == 'user_login_block' || $form_id == 'user_login') {
    drupal_add_js(drupal_get_path('module', 'exuser') .'/exuser.js');
    $form['external_identifier'] = array(
      '#type' => 'checkbox',
      '#title' => '外部登录',
      '#weight' => -3,
    );
    $form['external_name'] = array(
      '#type' => 'textfield',
      '#title' => '外部用户名',
      '#size' => 15,
      '#maxlength' => 11,
      '#required' => true,
      '#weight' => -2,
    );
    $form['external_pass'] = array(
      '#type' => 'password',
      '#title' => '外部密码',
      '#size' => 15,
      '#required' => true,
      '#weight' => -1,
    );
    if ($form_id == 'user_login') {
      $form['external_name']['#description'] = '请输入外部用户名';
      $form['external_pass']['#description'] = '请输入外部密码';
      unset($form['external_name']['#size'], $form['external_pass']['#size']);
    }

    if (isset($form_state['post']['external_identifier'])) {
      $form['name']['#required'] = false;
      $form['pass']['#required'] = false;
      unset($form['#submit']);
      $form['#validate'] = array('exuser_login_validate');
    } else {
      $form['external_name']['#required'] = false;
      $form['external_pass']['#required'] = false;
    }
  }
}

function exuser_login_validate($form, &$form_state)
{
  $external_name = $form_state['values']['external_name'];
  $external_pass = $form_state['values']['external_pass'];
  // TODO使用 $external_name $external_pass 进行外部验证函数,返回 true false
  $result = true;
  if ($result) {
   exuser_authenticate_complete($external_name, $form_state['values']);
  } else {
    drupal_set_message('用户登录失败', 'error');
  }
}
 
function exuser_authenticate_complete($identity, $values)
{
  $account = exuser_external_load($identity);
  if (isset($account->uid)) {
    user_external_login($account, $values);
  } else {
    // 构造注册表单
    $form_state = array();
    $form_state['redirect'] = NULL;
    $form_state['values']['name'] = $identity;
    $form_state['values']['mail'] = $identity . '@mobile';
    $form_state['values']['pass'] = user_password();
    $form_state['values']['status'] = true;
    $form_state['values']['response'] = $response;
    $form_state['values']['auth_openid'] = $identity;
    $form = drupal_retrieve_form('user_register', $form_state);
    drupal_prepare_form('user_register', $form, $form_state);
    drupal_validate_form('user_register', $form, $form_state);
    if (form_get_errors()) {
      drupal_set_message('用户注册失败', 'error');
      $destination = drupal_get_destination();
      unset($_REQUEST['destination']);
      drupal_goto('user/register', $destination);
    } else {
      // 注册成功
      $account = user_save('', $form_state['values']);
      if (!$account) {
        drupal_set_message('保存用户失败', 'error');
        drupal_goto();
      }
      // 插入用户名与 uid 对照表
      exuser_external_save($account, $identity);
      user_external_login($account);
    }
    drupal_redirect_form($form, $form_state['redirect']);
  }
}
 
function exuser_external_load($identity)
{
  $result = db_query("SELECT uid FROM {exuser_authenticate} WHERE name = '%s'", $identity);
  if ($user = db_fetch_array($result)) {
    return user_load($user);
  } else {
    return false;
  }
}
 
function exuser_external_save($account, $identity)
{
  db_query("INSERT INTO {exuser_authenticate} (`uid`, `name`) VALUES (%d, '%s')", $account->uid, $identity);
}

调用外部验证的时候,把 // TODO 那行改成你的验证方法就可以了。

在 user_login 和 user_login_block 的页面上会调用一个 JS 用来切换登录模式

exuser.js- (模组 Javascript)

Drupal.behaviors.exuser=function(context){
  var$loginElements=$("#edit-name-wrapper, #edit-pass-wrapper");
  var$ewayLoginElements=$("#edit-external-name-wrapper, #edit-external-pass-wrapper");
  var$identifierElement=$('#edit-external-identifier');
  varsetStatus=function(e){
    if($identifierElement.attr('checked')){
      $loginElements.hide();
      $ewayLoginElements.show();
    }else{
      $ewayLoginElements.hide();
      $loginElements.show();
    }
  };
  setStatus();
  $identifierElement.click(setStatus);
};

分享到:
评论

相关推荐

    drupal6 mime 6.0

    6. **过滤和验证**:为了防止垃圾邮件,MimeMail模块可以与其他反垃圾邮件解决方案配合使用,例如添加邮件验证机制,确保发送的邮件符合行业标准和最佳实践。 7. **国际化支持**:Drupal 6 强调多语言支持,...

    drupal建站CMS系统源码

    10. **Web服务和集成**:Drupal 8能够与外部系统集成,通过OAuth进行身份验证,还可以与其他Web服务(如Google Analytics)进行深度整合。 为了充分利用这个源码,你需要有一定的PHP基础,了解如何配置服务器环境,...

    drupal web services

    这使得 Drupal 网站能够提供 API 接口,供外部系统调用,实现数据共享和功能集成。 ##### Drupal 架构中的 Web Services 实现方式 在 Drupal 架构中,Web Services 的实现主要依赖于一系列模块和技术栈。这些模块...

    Drupal专业开发指南

    **6.6 外部登录** 实现外部登录功能,如通过社交媒体账户登录。 **6.7 简单的外部认证** 使用简单的HTTP认证或其他机制来验证用户身份。 **6.8 使用提供的服务器进行外部认证** 利用第三方认证服务进行用户身份...

    drupal专业开发指南(中文版).pdf

    - **菜单项**: 可以指向内部页面、外部链接或其他内容类型。 - **菜单渲染**: 菜单以HTML列表形式呈现,易于样式化和响应式设计。 #### 五、Drupal的数据库层 - **数据库交互**: 使用Drupal的数据库抽象层(DAL)来...

    Drupal 6 Javascript And Jquery

    - **案例一:动态表单验证**:在Drupal 6中,可以使用jQuery来实现表单提交前的实时验证,避免用户提交无效数据后才发现问题。 - **案例二:内容加载优化**:利用AJAX技术,可以在用户浏览时动态加载新内容,提升...

    PHP实例开发源码—内容管理系统 Drupal.zip

    6. `libraries`:存储外部库和JavaScript/CSS框架,供 Drupal 使用。 7. `scripts`:包含了 Drupal 的脚本工具,如安装和更新脚本。 通过深入学习这个源码,您可以: 1. 学习 Drupal 的钩子系统,理解如何通过钩子...

    formezauth-drupal-client:FormezAuth 的 Drupal 客户端

    【描述】FormezAuth Drupal客户端的核心功能在于提供了一个桥梁,使Drupal网站能够利用外部的FormezAuth服务处理用户的登录、注册和身份验证流程。此模块在Drupal的模块管理系统中易于安装和配置,允许管理员根据...

    drupal代码样本:一些drupal代码样本

    该模块获取外部信息,并验证xml文件中是否有新更改,如果有,则从外部源加载文件。 否则,它将使用存储在缓存变量中的信息。 此代码在greybeardrentals.com中使用,例如:评论部分中的 folder_royal_slider文件夹...

    uauth:这是Drupal 8的自定义模块,用于验证用户凭据并返回JSON以获取用户详细信息

    在Drupal中,用户认证通常依赖于内置的身份验证系统,如表单登录或OAuth2。然而,`uauth`模块提供了一个替代方案,允许开发者通过HTTP请求发送用户的凭据(如用户名和密码),然后模块会验证这些凭据,并在成功时...

    android_drupal:带有 Drupal 的 Android 示例

    在 "android_drupal" 示例中,开发者会学习如何利用这些 API 来获取文章、用户信息,甚至执行登录和评论等操作。 2. **OAuth 身份验证** 为了安全地与 Drupal 系统交互,通常需要使用 OAuth 身份验证。Android ...

    appointment:[未使用] Drupal 约会系统,使用 Webform、视图和自定义实体

    用户可以自定义表单字段,如姓名、性别、年龄、兴趣爱好等,并设置验证规则确保数据的准确性。此外,Webform 还支持邮件通知和结果存储,方便管理员对预约请求进行处理和跟踪。 **视图(Views)模块** Drupal 的...

    drupal_themes:自定义主题-Drupal 7

    2. **JavaScript Libraries**:Drupal 7支持通过libraries.yml文件来注册和管理JavaScript库,包括外部库(如jQuery UI)和主题内的自定义脚本。这些库可以在页面上按需加载,提高性能。 创建自定义Drupal 7主题的...

    All_Projects:Drupal_Javascrip_Datapower

    1. **Drupal与JavaScript的结合**:在Drupal中,JavaScript通常用于创建动态效果、表单验证、AJAX(异步JavaScript和XML)请求等。Drupal 8及以上版本开始大量采用React.js,一个流行的JavaScript库,用于构建用户...

    ionic-Bloging-app

    这些方法允许用户通过Drupal 7系统登录,获取令牌,然后在后续请求中携带该令牌以验证用户身份,确保数据的安全传输。 在实际的项目代码中,我们可以看到**JavaScript**的使用,它是Ionic应用的主要编程语言。...

    复现DC-1靶机.pdf

    5. Drupal CMS框架的漏洞攻击:文档指出靶机基于Drupal CMS,因此针对性地寻找和使用 Drupal 相关的攻击工具,例如Drupal OpenID XXE(外部实体注入)、Drupal Views 用户枚举工具,以及Drupal Drupageddon(SQL注入...

    企业软件开发管理系统的设计与实现.pdf

    为了实现系统对外部系统的扩展和功能需求,论文采用了Drupal框架平台。Drupal是一个流行的开源内容管理系统,具有强大的模块化和可扩展性,能够灵活地集成各种功能和服务。此外,通过应用最近邻检索算法和推理技术,...

    entity_rest_extra:额外的Rest资源以启用访问实体配置

    以下资源有助于获取有关Drupal 8的管理员信息,供外部实现(即无头Drupal)使用。 有人建议将此想法作为Drupal 8 Core的补丁程序,为 所有资源都需要经过具有权限的用户的身份验证。管理内容类型 该项目被用作 ...

    商业测试D8

    1. **性能测试**:验证Drupal 8网站在高流量或大量并发用户下的响应速度和稳定性。这包括数据库查询优化、缓存策略和服务器配置的评估。 2. **功能测试**:确保所有模块、插件和自定义功能按预期工作。这包括内容...

Global site tag (gtag.js) - Google Analytics