2012-01-24 69 views
4

我正在尝试使用,一个Ajax文件上传器,Play Framework如何将会话cookie传递给Uploadify?

Uploadify使用Flash对象与服务器通话...所以默认情况下它不会使用播放cookie。我想正确认证我的用户,所以我需要通过uploadify来发送一些cookie。

有没有人有两个在一起工作的工作示例,或者,失败了,一些指针?

+0

值得注意的是,如果您使用'httpOnly',则可能无法以这种方式使用Play的标准身份验证。我正在考虑放弃'httpOnly'。 – ripper234

+1

此外,有关与其他web框架中的Uploadify类似问题的相关问题:http://stackoverflow.com/questions/1729179/uploadify-session-and-authentication-with-asp-net-mvc和http:// stackoverflow。 com/questions/1284666/sessions-and-uploadify – ripper234

回答

0

好吧,如果你使用httpOnly配置,那么它是不可能发挥的本地身份验证的cookie传递到(and you should!) uploadify。

我所做的是:

1.不要用@With(Secure.class)确保图像控制器,而是使用一个before method

@Before(unless = "uploadPost") 
public static void before() throws Throwable { 
    Secure.checkAccess(); 
} 

2.转嫁给两个参数从呈现控制器承载uploadify插件的页面:userId和signedUserId

String userIdSignature = Crypto.sign(Long.toString(user.id)); 
render(..., user.id, userIdSignature); 

3.使这两个参数uploadify,并以uploadPost方法

public static void uploadPost(Upload upload, long userId, String userIdSignature) { 
    assertEquals(userIdSignature, Crypto.sign(Long.toString(userId)), 
     "Failed to authenticate user ID " + userId); 

如果由于某种原因,你不希望客户知道其用户ID,签约另一种是加密的用户ID。

请注意,您仍然使用这种方法暴露重播攻击,但我相信这是Play的一个普遍问题(我可能会误解这个)。您可以添加到期签名的过期日期以限制损失。

0

uploadify有一个选项叫做scriptData您可以用来发送您的authentityToken:

#{authenticityToken /} 

<script> 
var token = $('#input[name=authenticityToken]').val(); 
$('#file_upload').uploadify({ 
    'uploader' : '/uploadify/uploadify.swf', 
    'script'  : '/uploadify/uploadify.php', 
    'cancelImg' : '/uploadify/cancel.png', 
    'folder'  : '/uploads', 
    'scriptData' : {'authenticyToken': token} 
}); 
</script> 
+0

我知道scriptData。那么你是否说已经有一个由Play生成的名为'authenticityToken'的隐藏输入字段?我认为会话是通过cookie处理的。 – ripper234

+0

啊,你的意思是使用http://www.playframework.org/documentation/current/tags#authenticityToken。另外值得一提的是内置的'#{form}'标签自动添加了它。 http://www.playframework.org/documentation/current/tags#form – ripper234

+0

这还不够,至少不是安全模块(例如'Secure.checkAccess()'需要'用户名'在会话中)。也许我应该复制整个会话cookie?不知道我会怎么做,但。 – ripper234