Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 如何从Flex/Flash登录Drupal用户(或获取当前登录的用户)?_Apache Flex_Flash_Drupal - Fatal编程技术网

Apache flex 如何从Flex/Flash登录Drupal用户(或获取当前登录的用户)?

Apache flex 如何从Flex/Flash登录Drupal用户(或获取当前登录的用户)?,apache-flex,flash,drupal,Apache Flex,Flash,Drupal,我有一个从Drupal页面托管的Flash应用程序。Flash应用程序的某些部分应可供所有用户使用,但某些部分应仅可供登录用户使用。具体的角色并不重要,只是他们是网站的任何授权用户 在Flash中,我可以通过屏幕抓取?q=用户页面来检测用户是否登录,但这非常脆弱。正确的方法是什么?如果需要,我可以安装其他模块,但它们需要与Drupal 6兼容,而不是与Drupal 5兼容 同样,如果当前没有用户登录,我如何获取他们提供给我的用户名和密码并登录或确定密码不正确?正确的解决方案 你可能想看看类似的东

我有一个从Drupal页面托管的Flash应用程序。Flash应用程序的某些部分应可供所有用户使用,但某些部分应仅可供登录用户使用。具体的角色并不重要,只是他们是网站的任何授权用户

在Flash中,我可以通过屏幕抓取?q=用户页面来检测用户是否登录,但这非常脆弱。正确的方法是什么?如果需要,我可以安装其他模块,但它们需要与Drupal 6兼容,而不是与Drupal 5兼容

同样,如果当前没有用户登录,我如何获取他们提供给我的用户名和密码并登录或确定密码不正确?

正确的解决方案 你可能想看看类似的东西。基本上,您希望将用户服务公开给您的flash应用程序,这样您就可以通过XML-RPC或您选择的任何实现发送请求,以获取信息,例如当前登录的用户具有什么访问权限,或者使用用户名x和密码y登录此用户等等

快速自己动手解决方案 如果您熟悉模块开发,您可以快速创建自己的模块,以获得所需的功能,而无需经过真正的web服务层。下面是一个快速示例,创建一个名为myservices的模块:

<?php
// myservices.info
   name = My Services
   description = Expose basic services
   core = 6.x

<?php
// myservices.module

   function myservices_menu() {
       $items['myservices/user'] = array(
         'title' => 'Get auth',
         'page callback' => 'myservices_get_user',
         'access arguments' => array('access content'),
       );
       return $items;
   }

   function myservices_get_user() {
       global $user;
       if (in_array('authenticated user', $user->roles) ) {
           print 'yes';
       } else {
           print 'no';
       }
   }
将这两个文件放在模块目录的myservices目录中,激活它,然后转到http://yourdomain.com/myservices/user

如果您通过身份验证,它只会返回yes,如果不是no,等等。。。您可以在flash应用程序中选择它。

正确的解决方案 你可能想看看类似的东西。基本上,您希望将用户服务公开给您的flash应用程序,这样您就可以通过XML-RPC或您选择的任何实现发送请求,以获取信息,例如当前登录的用户具有什么访问权限,或者使用用户名x和密码y登录此用户等等

快速自己动手解决方案 如果您熟悉模块开发,您可以快速创建自己的模块,以获得所需的功能,而无需经过真正的web服务层。下面是一个快速示例,创建一个名为myservices的模块:

<?php
// myservices.info
   name = My Services
   description = Expose basic services
   core = 6.x

<?php
// myservices.module

   function myservices_menu() {
       $items['myservices/user'] = array(
         'title' => 'Get auth',
         'page callback' => 'myservices_get_user',
         'access arguments' => array('access content'),
       );
       return $items;
   }

   function myservices_get_user() {
       global $user;
       if (in_array('authenticated user', $user->roles) ) {
           print 'yes';
       } else {
           print 'no';
       }
   }
将这两个文件放在模块目录的myservices目录中,激活它,然后转到http://yourdomain.com/myservices/user


如果您通过身份验证,它只会返回yes,如果不是no,等等。。。您可以在flash应用程序中选择它。

我可以使用Drupal的系统和用户服务实现这一点:

安装 启用系统和用户服务 对于下面的代码,请禁用API密钥。或者让它们处于启用状态并提供额外的参数 已验证用户和匿名用户访问服务的权限 在撰写本文时,AMFPHP服务尚未移植到Drupal6,因此我使用了XMLRPC。为了使用ActionScript中的XMLRPC,我使用了位于的帮助程序库。这个库是为ActionScript2编写的,所以将它与Flex3一起使用需要我对其进行修补,正如jameshyu在2008年5月10日的“向下滚动页面并搜索评论”中所述

完成所有这些先决条件后,您可以检查当前登录的用户(如果有)和/或使用如下代码登录用户

以下是实际实现登录的模块:

package
{
    import com.ak33m.rpc.xmlrpc.XMLRPCObject;

    import flash.events.*;
    import flash.net.*;

    import mx.collections.ItemResponder;
    import mx.rpc.AsyncToken;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;


    public class DrupalLogin
    {
        private var _api:XMLRPCObject;

        public function DrupalLogin( url:String )
        {
            _api = new XMLRPCObject();
            _api.endpoint = url;
            _api.destination = "";
        }

        public function set LoginResult( fn:Function ):void {_handleLoginResult = fn; }
        public function set CheckResult( fn:Function ):void {_handleCheckResult = fn; }
        public function set LogoutResult( fn:Function ):void {_handleLogoutResult = fn; }
        public function get User():String { return _user; }
        public function set TraceResult( fn:Function ):void {_handleTrace = fn; }

        private var _handleLoginResult:Function;
        private var _handleCheckResult:Function;
        private var _handleLogoutResult:Function;
        private var _handleTrace:Function;

        private function onTrace( st:String ):void
        {
            _handleTrace(st);
        }

        private var _firstCheckDone:Boolean = false;
        private var _loggedIn:Boolean = false;


        // The logged-in user's ID (if any)
        private var _user:String = "";



        // *****************************************
        // doLogin
        // *****************************************

        // Function doLogin kicks off the process.
        public function doLogin( user:String, pwd:String ):void
        {
            onTrace( "******************* doLogin ********************" );

            if( !_firstCheckDone )
            {
                _handleLoginResult( false, "ALWAYS CALL doCheck() FIRST TO SEE IF YOU NEED TO LOG IN OR NOT" );
                return;
            }
            if( _loggedIn )
            {
                _handleLoginResult( true, "YOU ARE ALREADY LOGGED IN" );
                return;
            }

            var token:AsyncToken = _api.call( "user.login", _sid, user, pwd );
            var tresponder:ItemResponder = new ItemResponder(this.onLoginInfo,this.onLoginFault);
            token.addResponder(tresponder);
        }


        private function onLoginInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "... got onLoginInfo" );

            _user = event.result.user.name;
            _loggedIn = true;
            _handleLoginResult( true, "logged in ok" );         
        }

        private function onLoginFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "   got onLoginFault" );

            _loggedIn = false;
            _handleLoginResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }


        // *****************************************
        // doLogout
        // *****************************************

        public function doLogout():void
        {
            onTrace( "******************* doLogout ********************" );

            if( !_firstCheckDone )
            {
                _handleLogoutResult( false, "ALWAYS CALL doCheck() FIRST TO SEE IF YOU ARE ABLE TO LOG OUT OR NOT" );
                return;
            }
            if( !_loggedIn )
            {
                _handleLogoutResult( true, "YOU ARE ALREADY LOGGED OUT" );
                return;
            }

            var token:AsyncToken = _api.call( "user.logout", _sid );
            var tresponder:ItemResponder = new ItemResponder(this.onLogoutInfo,this.onLogoutFault);
            token.addResponder(tresponder);
        }

        private function onLogoutInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "got onLogoutInfo" );

            _loggedIn = false;
            _handleLogoutResult( true, "logged out ok" );           
        }

        private function onLogoutFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "got onLogoutFault" );

            _loggedIn = false;
            _handleLogoutResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }


        // *****************************************
        // doCheckLogin
        // *****************************************

        private var _sid:String;

        public function doCheckLogin():void
        {
            onTrace( "******************* doCheckLogin ********************" );

            var token:AsyncToken = _api.call( "system.connect" );
            var tresponder:ItemResponder = new ItemResponder(this.onCheckInfo,this.onCheckFault);
            token.addResponder(tresponder);

        }

        private function onCheckInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "got onCheckInfo" );

            _user = event.result.user.name;
            _sid = event.result.user.sid;
            var roles:Object = event.result.user.roles;
            _loggedIn = false;
            for( var i:int=0; i<10; i++ )
            {
                var tmp:String = roles[i.toString()];
                if( tmp == "authenticated user" )
                    _loggedIn = true;
            }

            trace( "user = " + _user + ", sid=" + _sid + ", loggedIn=" + _loggedIn );
            _firstCheckDone = true;

            _handleCheckResult( _loggedIn, _loggedIn?("Currently logged in as " + _user):"Not logged in yet" );
        }

        private function onCheckFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "got onCheckFault" );

            _handleCheckResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }

    }
}
下面是一个使用它的示例:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="LoginExample.as" />
    <mx:Button id="btnGoodLogin" click="btnGoodLogin_onClick()"  label="Good Login" enabled="true" y="28"/>
    <mx:Button id="btnBadLogin" click="btnBadLogin_onClick()"  label="Bad Login" enabled="true" y="28" x="112"/>
    <mx:Button id="btnLogout" click="btnLogout_onClick()"  label="Logout" enabled="true" y="28" x="219"/>
    <mx:Button id="btnCheck" click="btnCheck_onClick()"  label="Check" enabled="true" y="28" x="325"/>
    <mx:Text id="txtResult"  y="58" width="263"/>
</mx:Application>





import flash.events.*;
import flash.net.*;

private var _login:DrupalLogin;

private function setup():void
{
    if( _login==null )
    {
        var url:String = "http://myserver/mydrupal?q=services/xmlrpc";

        _login = new DrupalLogin(url);
        _login.CheckResult = handleCheckResult;
        _login.LoginResult = handleLoginResult;
        _login.LogoutResult = handleLogoutResult;
        _login.TraceResult = handleTraceResult;
    }
}

private function btnGoodLogin_onClick():void
{
    setup();
    _login.doLogin( "goodname", "goodpwd" );
}

private function btnBadLogin_onClick():void
{
    setup();
    _login.doLogin( "badname", "badpwd" );
}

private function btnLogout_onClick():void
{
    setup();
    _login.doLogout();
}

private function btnCheck_onClick():void
{
    setup();
    _login.doCheckLogin();
}



private function showResult( result:String):void
{
    trace( "showResult: " + result );
    txtResult.text = result;    
}

private function handleTraceResult( text:String ):void
{
    trace( text );
}



private function handleCheckResult( loggedIn:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedIn )
        showResult( "ALREADY LOGGED IN AS " + _login.User + txt);
    else
        showResult( "NOT LOGGED IN YET" + txt );
}

private function handleLoginResult( loggedIn:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedIn )
        showResult( "LOGIN ATTEMPT SUCCEEDED" + txt);
    else
        showResult( "LOGIN ATTEMPT FAILED" + txt );
}

private function handleLogoutResult( loggedOut:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedOut )
        showResult( "LOGOUT ATTEMPT SUCCEEDED" + txt );
    else
        showResult( "LOGOUT ATTEMPT FAILED" + txt);
}

我能够使用Drupal的系统和用户服务做到这一点:

安装 启用系统和用户服务 对于下面的代码,请禁用API密钥。或者让它们处于启用状态并提供额外的参数 已验证用户和匿名用户访问服务的权限 在撰写本文时,AMFPHP服务尚未移植到Drupal6,因此我使用了XMLRPC。为了使用ActionScript中的XMLRPC,我使用了位于的帮助程序库。这个库是为ActionScript2编写的,所以将它与Flex3一起使用需要我对其进行修补,正如jameshyu在2008年5月10日的“向下滚动页面并搜索评论”中所述

完成所有这些先决条件后,您可以检查当前登录的用户(如果有)和/或使用如下代码登录用户

以下是实际实现登录的模块:

package
{
    import com.ak33m.rpc.xmlrpc.XMLRPCObject;

    import flash.events.*;
    import flash.net.*;

    import mx.collections.ItemResponder;
    import mx.rpc.AsyncToken;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;


    public class DrupalLogin
    {
        private var _api:XMLRPCObject;

        public function DrupalLogin( url:String )
        {
            _api = new XMLRPCObject();
            _api.endpoint = url;
            _api.destination = "";
        }

        public function set LoginResult( fn:Function ):void {_handleLoginResult = fn; }
        public function set CheckResult( fn:Function ):void {_handleCheckResult = fn; }
        public function set LogoutResult( fn:Function ):void {_handleLogoutResult = fn; }
        public function get User():String { return _user; }
        public function set TraceResult( fn:Function ):void {_handleTrace = fn; }

        private var _handleLoginResult:Function;
        private var _handleCheckResult:Function;
        private var _handleLogoutResult:Function;
        private var _handleTrace:Function;

        private function onTrace( st:String ):void
        {
            _handleTrace(st);
        }

        private var _firstCheckDone:Boolean = false;
        private var _loggedIn:Boolean = false;


        // The logged-in user's ID (if any)
        private var _user:String = "";



        // *****************************************
        // doLogin
        // *****************************************

        // Function doLogin kicks off the process.
        public function doLogin( user:String, pwd:String ):void
        {
            onTrace( "******************* doLogin ********************" );

            if( !_firstCheckDone )
            {
                _handleLoginResult( false, "ALWAYS CALL doCheck() FIRST TO SEE IF YOU NEED TO LOG IN OR NOT" );
                return;
            }
            if( _loggedIn )
            {
                _handleLoginResult( true, "YOU ARE ALREADY LOGGED IN" );
                return;
            }

            var token:AsyncToken = _api.call( "user.login", _sid, user, pwd );
            var tresponder:ItemResponder = new ItemResponder(this.onLoginInfo,this.onLoginFault);
            token.addResponder(tresponder);
        }


        private function onLoginInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "... got onLoginInfo" );

            _user = event.result.user.name;
            _loggedIn = true;
            _handleLoginResult( true, "logged in ok" );         
        }

        private function onLoginFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "   got onLoginFault" );

            _loggedIn = false;
            _handleLoginResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }


        // *****************************************
        // doLogout
        // *****************************************

        public function doLogout():void
        {
            onTrace( "******************* doLogout ********************" );

            if( !_firstCheckDone )
            {
                _handleLogoutResult( false, "ALWAYS CALL doCheck() FIRST TO SEE IF YOU ARE ABLE TO LOG OUT OR NOT" );
                return;
            }
            if( !_loggedIn )
            {
                _handleLogoutResult( true, "YOU ARE ALREADY LOGGED OUT" );
                return;
            }

            var token:AsyncToken = _api.call( "user.logout", _sid );
            var tresponder:ItemResponder = new ItemResponder(this.onLogoutInfo,this.onLogoutFault);
            token.addResponder(tresponder);
        }

        private function onLogoutInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "got onLogoutInfo" );

            _loggedIn = false;
            _handleLogoutResult( true, "logged out ok" );           
        }

        private function onLogoutFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "got onLogoutFault" );

            _loggedIn = false;
            _handleLogoutResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }


        // *****************************************
        // doCheckLogin
        // *****************************************

        private var _sid:String;

        public function doCheckLogin():void
        {
            onTrace( "******************* doCheckLogin ********************" );

            var token:AsyncToken = _api.call( "system.connect" );
            var tresponder:ItemResponder = new ItemResponder(this.onCheckInfo,this.onCheckFault);
            token.addResponder(tresponder);

        }

        private function onCheckInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "got onCheckInfo" );

            _user = event.result.user.name;
            _sid = event.result.user.sid;
            var roles:Object = event.result.user.roles;
            _loggedIn = false;
            for( var i:int=0; i<10; i++ )
            {
                var tmp:String = roles[i.toString()];
                if( tmp == "authenticated user" )
                    _loggedIn = true;
            }

            trace( "user = " + _user + ", sid=" + _sid + ", loggedIn=" + _loggedIn );
            _firstCheckDone = true;

            _handleCheckResult( _loggedIn, _loggedIn?("Currently logged in as " + _user):"Not logged in yet" );
        }

        private function onCheckFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "got onCheckFault" );

            _handleCheckResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }

    }
}
下面是一个使用它的示例:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="LoginExample.as" />
    <mx:Button id="btnGoodLogin" click="btnGoodLogin_onClick()"  label="Good Login" enabled="true" y="28"/>
    <mx:Button id="btnBadLogin" click="btnBadLogin_onClick()"  label="Bad Login" enabled="true" y="28" x="112"/>
    <mx:Button id="btnLogout" click="btnLogout_onClick()"  label="Logout" enabled="true" y="28" x="219"/>
    <mx:Button id="btnCheck" click="btnCheck_onClick()"  label="Check" enabled="true" y="28" x="325"/>
    <mx:Text id="txtResult"  y="58" width="263"/>
</mx:Application>





import flash.events.*;
import flash.net.*;

private var _login:DrupalLogin;

private function setup():void
{
    if( _login==null )
    {
        var url:String = "http://myserver/mydrupal?q=services/xmlrpc";

        _login = new DrupalLogin(url);
        _login.CheckResult = handleCheckResult;
        _login.LoginResult = handleLoginResult;
        _login.LogoutResult = handleLogoutResult;
        _login.TraceResult = handleTraceResult;
    }
}

private function btnGoodLogin_onClick():void
{
    setup();
    _login.doLogin( "goodname", "goodpwd" );
}

private function btnBadLogin_onClick():void
{
    setup();
    _login.doLogin( "badname", "badpwd" );
}

private function btnLogout_onClick():void
{
    setup();
    _login.doLogout();
}

private function btnCheck_onClick():void
{
    setup();
    _login.doCheckLogin();
}



private function showResult( result:String):void
{
    trace( "showResult: " + result );
    txtResult.text = result;    
}

private function handleTraceResult( text:String ):void
{
    trace( text );
}



private function handleCheckResult( loggedIn:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedIn )
        showResult( "ALREADY LOGGED IN AS " + _login.User + txt);
    else
        showResult( "NOT LOGGED IN YET" + txt );
}

private function handleLoginResult( loggedIn:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedIn )
        showResult( "LOGIN ATTEMPT SUCCEEDED" + txt);
    else
        showResult( "LOGIN ATTEMPT FAILED" + txt );
}

private function handleLogoutResult( loggedOut:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedOut )
        showResult( "LOGOUT ATTEMPT SUCCEEDED" + txt );
    else
        showResult( "LOGOUT ATTEMPT FAILED" + txt);
}

我知道这与最初发表这篇文章的时候相比还有很长的路要走,但是如果你仍然对这篇文章感兴趣,并且从来没有花时间对它进行过很多研究,那么我就想出了如何通过flash文档成功地处理登录。嵌入的或外部的。它甚至不需要在系统上安装AMFPHP。这很好,因为我上次检查AMFPHP所依赖的服务模块时,该模块还没有建议的状态

我在这里设置了一个演示页面:

您可以登录和注销,它将检测您是否已经登录。这项工作仍在进行中,但大部分 你需要的东西已经为你准备好了

如果您想查看文档并想要源代码的副本,请在此处找到所有这些内容:


我希望这有帮助。我应该在下周的某个时候对该演示进行更新,所以如果您想要我在文章中提到的其他一些功能,请回头查看。

我知道这与最初制作此文章的时间相比还有很长的路要走,但是如果您仍然对此感兴趣,并且从未花时间对其进行过大量研究,我想出了如何通过flash文档成功处理登录。嵌入的或外部的。它甚至不需要在系统上安装AMFPHP。这很好,因为我上次检查AMFPHP所依赖的服务模块时,该模块还没有建议的状态

我在这里设置了一个演示页面:

您可以登录和注销,它将检测您是否已经登录。这仍然是一项正在进行的工作,但是你需要的大部分东西都已经为你准备好了

如果您想查看文档并想要源代码的副本,请在此处找到所有这些内容:

我希望这有帮助。我应该在下周的某个时候对这个演示进行更新,所以如果你想要我在帖子中提到的其他一些功能,请回头看看