惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
L
LangChain Blog
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
量子位
A
About on SuperTechFans
C
Check Point Blog
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
I
InfoQ
V
Visual Studio Blog
Vercel News
Vercel News
B
Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
U
Unit 42

博客园 - 糊涂隐锋

[转]SSH框架搭建 Java与Flex通信[转] 使用 Eclipse Memory Analyzer 检测内存泄漏问题 [转] Myeclipse SVN 插件安装 将mina整合到tomcat中 JIRA管理思路[转] linux下安装jira4.4.1[转] CentOS 6.0 安装配置rails 2.3.11 + redmine 1.2.1 笔记[转] 安装项目管理工具 SVN+Redmine[转] MySql 优化[转] Spring中常用的操作数据库的(Dao)方法 [转] Red5共享对象的处理机制[转] quartz数据库方式与web工程整合 ShareObject 主要用途 - 糊涂隐锋 - 博客园 FLEX提高篇---------FMS两种方式实现简易聊天室 - 糊涂隐锋 - 博客园 ShareObject对象详解 shareObject的使用 Flex 中需要记住的一些东西[转] Flex或Flash的跨域访问解决方案
【转载】Red5 0.6 安全
糊涂隐锋 · 2010-05-27 · via 博客园 - 糊涂隐锋

==========================
此文档描述Red5 API,介绍在0.6版中对流和/或共享对象的访问保护。类似`Client.readAccess`和`Client.writeAccess`在 Macromedia Flash Communication Server / Flash Media Server 2中所提供的作用。


==========================
在Red5中,读(重放)和写(发布/录制)访问到流是被分开保护的。

流重放安全
--------------------------
希望限制每个用户流的重放或者只希望提供给定名称的流的访问,可以用到IStreamPlaybackSecurity接口。

它可以被一些对象实现,并在ApplicationAdapter注册。流安全handler的一个专有数字被每个程序所支持。只要有一个handler 拒绝访问,客户端就会收到一个错误`NetStream.Failed`,它包含一个`descr iption`字段提供通讯错误信息。

一个handler例子,只允许访问以`liveStream`开始的流,描述如下:

  import org.red5.server.api.IScope;
  import org.red5.server.api.stream.IStreamPlaybackSecurity;
 
  public class NamePlaybackSecurity implements IStreamPlaybackSecurity {
 
    public boolean isPlaybackAllowed(IScope scope, String name, int start,
      int length, boolean flushPlaylist) {
        if (!name.startswith("liveStream")) {
            return false;
        } else {
            return true;
        }
    };
   
  }

注册这个handler到程序中,加入以下代码到`appStart`方法中:

  registerStreamPlaybackSecurity(new NamePlaybackSecurity());

Red5包含了一个拒绝任何流访问的handler(DenyAllStreamAccess)

流发布安全
--------------------------
在大部分程序中,允许用户发布和/或录制流,此访问必须被限制以防止此服务被滥用。
因此,Red5提供IStreamPublishSecurity接口来拒绝某些流的发布。

类似IStreamPlaybackSecurity,它可以被一些对象实现,并在ApplicationAdapter中注册。只要一个已注册的 handler拒绝访问,客户端就会收到一个错误`NetStream.Failed`,它包含一个`desc ription`字段提供通讯错误信息。

一个handler例子,只允许被鉴别的连接发布以`liveStream`开始的实时流,并拒绝其它所有的访问。描述如下:

  import org.red5.server.api.IConnection;
  import org.red5.server.api.IScope;
  import org.red5.server.api.Red5;
  import org.red5.server.api.stream.IStreamPublishSecurity;
 
  public class AuthNamePublishSecurity implements IStreamPublishSecurity {
 
    public isPublishAllowed(IScope scope, String name, String mode) {
        if (!"live".equals(mode)) {
            // 不是一个实时流
            return false;
        }
   
        IConnection conn = Red5.getConnectionLocal();
        if (!"authenticated".equals(conn.getAttribute("UserType"))) {
            // 用户没有被鉴别
            return false;
        }
       
        if (!name.startswith("liveStream")) {
            return false;
        } else {
            return true;
        }
    };
   
  }

注册这个handler到程序中,加入以下代码到`appStart`方法中:

  registerStreamPublishSecurity(new AuthNamePublishSecurity());

当然,你也可以在一个`*Connect`或`*Join`方法中加入代码来设置`UserType`属性,以使用户获得鉴别,从而能够允许发布流。

Red5包含了一个拒绝任何流访问的handler(DenyAllStreamAccess)


共享对象
==========================
一旦程序变得复杂,你可能希望控制存储在共享对象中的数据,因此不允许客户端直接修改共享对象,只能通过程序的方法来暴露。

ISharedObjectSecurity接口可以用于写handler,在给定的共享对象上拒绝某些动作,防止客户端任意的创建共享对象。

下面的例子只允许持久化共享对象`Chat`的创建。任何客户端都可以连接到它,只允许通过共享对象发送`saySomething`信息。所有到属性的写访问都被拒绝。你可以通过服务端改变属性,但是这些改变都是不被安全handler所保护的。

  import java.util.List;
  import org.red5.server.api.IScope;
  import org.red5.server.api.so.ISharedObject;
  import org.red5.server.api.so.ISharedObjectSecurity;
 
  public class SampleSOSecurityHandler implements ISharedObjectSecurity {
   
    public boolean isConnectionAllowed(ISharedObject so) {
        // note: we don't check for the name here as only one SO can be
        //       created with this handler.
        return true;
    }
   
    public boolean isCreationAllowed(IScope scope, String name,
      boolean persistent) {
        if (!"Chat".equals(name) || !persistent) {
            return false;
        } else {
            return true;
        }
    }
   
    public boolean isDeleteAllowed(ISharedObject so, String key) {
        return false;
    }
   
    public boolean isSendAllowed(ISharedObject so, String message,
      List arguments) {
        if (!"saySomething".equals(message)) {
            return false;
        } else {
            return true;
        }
    }
   
    public boolean isWriteAllowed(ISharedObject so, String key,
      Object value) {
        return false;
    }
   
  }

注册这个handler到程序中,加入以下代码到`appStart`方法中:

  registerSharedObjectSecurity(new SampleSOSecurityHandler());

如果你希望注册一个安全handler只为一个给定的共享对象,代码如下:
 
  ISharedObject so = getSharedObject(scope, "MySharedObject");
  so.registerSharedObjectSecurity(new MySOSecurityHandler());


Red5 API
org.red5.server.api.stream.IStreamPlaybackSecurity
org.red5.server.adapter.ApplicationAdapter
org.red5.server.api.stream.support.DenyAllStreamAccess
org.red5.server.api.stream.IStreamPublishSecurity
org.red5.server.api.so.ISharedObjectSecurity