Java CometD安全请求

Java CometD安全请求,java,comet,cometd,Java,Comet,Cometd,我正在使用CometD,我有一个服务设置(服务器端的Java),如下所示: http://localhost:8086/service/myService/get-玩家详细信息?参数={id:1234} 这在实践中效果很好,但我担心的是,任何用户都可以使用上述URL查询我的服务,并检索其他玩家的详细信息 建议采取什么方式来防范此类问题?授权人是正确的方法吗?如果您发布的URL是映射到Comed的,那么我强烈建议您使用此类URL来传递URL中的参数等信息 首先,如果您使用非HTTP的其他传输,例如

我正在使用CometD,我有一个服务设置(服务器端的Java),如下所示:

http://localhost:8086/service/myService/get-玩家详细信息?参数={id:1234}

这在实践中效果很好,但我担心的是,任何用户都可以使用上述URL查询我的服务,并检索其他玩家的详细信息


建议采取什么方式来防范此类问题?授权人是正确的方法吗?

如果您发布的URL是映射到Comed的,那么我强烈建议您使用此类URL来传递URL中的
参数等信息

首先,如果您使用非HTTP的其他传输,例如WebSocket,这将不起作用

其次,正如您所注意到的,URL可能会公开您不想公开的信息

我建议您更改从服务器检索信息的方式,不要使用URL,而只使用消息

如果您与服务器的所有通信都是通过消息进行的,则会提示消息来自允许握手的客户端。您只需要在握手时使用
SecurityPolicy
执行正确的身份验证检查,如中所述

使用CometD JavaScript客户端库,消息将具有以下形式:

cometd.publish("/service/player", { action:"get", playerId: 1234 });
您可能希望将“动作”放入频道本身,例如:

cometd.publish("/service/player/get", { playerId: 1234 });
这样,您就有了更多的小服务(每个服务响应不同的频道,因此响应不同的
操作
),这可能是需要的

阅读服务部分的内容可能会为您提供更多信息

我不建议将
playerId
放入频道,原因有二:

  • 避免创建过多通道
  • 为了在代码中及时获得这些信息,您不需要解析通道(尽管CometD支持);解析比只做
    message.get(“playerId”)
    的成本更高
要将响应发送到客户端,服务器只需调用:

@Service
public class GetPlayer
{
    @Session
    private LocalSession sender;

    @Listener("/service/player/get")
    public void perform(ServerSession session, ServerMessage message)
    {
        Map<String, Object> player = retrievePlayerInfo(message.get("playerId"));
        session.deliver(sender, message.getChannel(), player);
    }
}
@服务
公共类GetPlayer
{
@会议
专用本地会话发送器;
@侦听器(“/service/player/get”)
public void perform(ServerSession会话、ServerMessage消息)
{
Map player=retrieveplayerfo(message.get(“playerId”);
session.deliver(发送者,message.getChannel(),播放器);
}
}
注意使用
ServerSession.deliver()
将响应返回给该特定客户端

以上内容保证(使用适当的
安全策略
)只有经过身份验证的客户端才能发送和接收消息

您现在需要做的是设置正确的授权,特别是玩家
123
无法通过破解其发送的Comet消息来扮演玩家
789
。 这是授权人的工作,请参见中的部分和示例

您必须做的是在通过
playerIds
验证的用户之间建立一种关系,允许她查看。这是特定于应用程序的,是授权人实现的核心

有了适当的
安全策略
授权人
,您的应用程序就不会受到问题的影响

严格地说,
授权人
可能就足够了,但通常如果您想要强制执行授权策略,还需要身份验证,这是由
安全策略
提供的