2012-04-19 3 views
0

Je suis en train de changer le code source de l'application fitcDemo pour Red5 et de le rendre en quelque sorte authentifier le nom d'utilisateur avant de le laisser se connecter au serveur mais je n'ai aucune idée de comment commencer!
Je veux dire que je ne sais pas quelle méthode sera appelée lors de la connexion du client et comment obtenir le nom d'utilisateur de l'application cliente.
Je vais apporter le code source ici pour que quelqu'un puisse m'aider.Comment authentifier un utilisateur dans l'échantillon Red5 `fitcDemo`?

package org.xyz; 

import java.util.List; 
import java.util.Set; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.red5.server.adapter.ApplicationAdapter; 
import org.red5.server.api.IClient; 
import org.red5.server.api.IConnection; 
import org.red5.server.api.IScope; 
import org.red5.server.api.Red5; 
import org.red5.server.api.service.IPendingServiceCall; 
import org.red5.server.api.service.IPendingServiceCallback; 
import org.red5.server.api.service.IServiceCapableConnection; 
import org.red5.server.api.stream.IBroadcastStream; 
import org.red5.server.api.stream.IPlayItem; 
import org.red5.server.api.stream.IPlaylistSubscriberStream; 
import org.red5.server.api.stream.IStreamAwareScopeHandler; 
import org.red5.server.api.stream.ISubscriberStream; 


public class Application extends ApplicationAdapter 
    implements IPendingServiceCallback, IStreamAwareScopeHandler 
{ 
    protected static Log log = LogFactory.getLog(Application.class); 

    public boolean appStart(IScope scope) 
    { 
    return true; 
    } 

    public boolean appConnect(IConnection conn, Object[] params) 
    { 
    IServiceCapableConnection service = (IServiceCapableConnection)conn; 
    log.info("Client connected {} conn {}"); 
    service.invoke("setId", new Object[] { conn.getClient().getId() }, this); 
    return true; 
    } 

    public boolean appJoin(IClient client, IScope scope) 
    { 
    log.info("Client joined app {}"); 

    IConnection conn = Red5.getConnectionLocal(); 
    return true; 
    } 

    public void streamPublishStart(IBroadcastStream stream) 
    { 
    if (log.isDebugEnabled()) { 
     log.debug("stream broadcast start: {}"); 
    } 
    IConnection current = Red5.getConnectionLocal(); 
    for (Set<IConnection> connections : this.scope.getConnections()) 
     for (IConnection conn : connections) { 
     if (conn.equals(current)) 
     { 
      continue; 
     } 

     if ((conn instanceof IServiceCapableConnection)) { 
      ((IServiceCapableConnection)conn).invoke("newStream", new Object[] { stream.getPublishedName() }, this); 

      if (log.isDebugEnabled()) 
      log.debug("sending notification to {}"); 
     } 
     } 
    } 

    public void streamRecordStart(IBroadcastStream stream) 
    { 
    } 

    public void streamBroadcastClose(IBroadcastStream stream) 
    { 
    } 

    public void streamBroadcastStart(IBroadcastStream stream) 
    { 
    } 

    public void streamPlaylistItemPlay(IPlaylistSubscriberStream stream, IPlayItem item, boolean isLive) 
    { 
    } 

    public void streamPlaylistItemStop(IPlaylistSubscriberStream stream, IPlayItem item) 
    { 
    } 

    public void streamPlaylistVODItemPause(IPlaylistSubscriberStream stream, IPlayItem item, int position) 
    { 
    } 

    public void streamPlaylistVODItemResume(IPlaylistSubscriberStream stream, IPlayItem item, int position) 
    { 
    } 

    public void streamPlaylistVODItemSeek(IPlaylistSubscriberStream stream, IPlayItem item, int position) 
    { 
    } 

    public void streamSubscriberClose(ISubscriberStream stream) 
    { 
    } 

    public void streamSubscriberStart(ISubscriberStream stream) 
    { 
    } 

    public List<String> getStreams() 
    { 
    IConnection conn = Red5.getConnectionLocal(); 
    return getBroadcastStreamNames(conn.getScope()); 
    } 

    public void resultReceived(IPendingServiceCall call) 
    { 
    log.info("Received result {} for {}"); 
    } 
} 

Répondre

1

Bien que Red5 fournit des méthodes pour le faire: How to Identify Publishers and Consumers using Red5 API je avais besoin de les identifier différemment en utilisant une base de données, cela a donc été mon approche. En supposant que vous connectez déjà une base de données avec des tables liées à l'utilisateur en rouge5. Si ce n'est pas le cas, le tutoriel officiel est un bon endroit pour commencer: http://www.red5tutorials.net/index.php/Tutorials:MySQL_and_Red5 Bien que le tutoriel soit pour MySQL, vous pouvez utiliser le pilote JDBC approprié pour votre base de données.

Vous devez d'abord envoyer un ID utilisateur du client dans la connexion() de NetConnection dans Flash en utilisant AS3:

var nc:NetConnection = new NetConnection(); 
var userID:String = "foo"; 
nc.connect("rtmp://" + ipAddrOfRed5Server + "/fitcDemo", userID); 

En Red5:

public boolean appConnect(IConnection conn , Object[] params) 
{ 
    try { 
     String uID = (String)params[0];    
     //Run a query here to check if the user exists in the DB. 
      // If not, you can call rejectClient("Not an existing user!"); 
      // Once authenticated here, your normal logic follows 
    } 
    } catch(Exception e){ 
     e.printStackTrace(); 
     log.error("Error handling User connect"); 
    }  
    return true; 

} 
Questions connexes