Restlet实战(十七)如何保护确定的资源
在面向资源的架构中,资源的保护的重要性不言而喻,且不说对那些资源进行新增、修改、删除的操作,就是get,有时候敏感资源也不是响应任何的请求。
但有时候我们要面临这样一种情况:对所有资源的部分资源进行认证保护,比如,对所有基于get资源的访问不作任何认证,而对其它的如PUT、POST、DELETE,则只对部分某一部分资源进行认证保护,如/customers, /customers/{customerId}.而对/users, /users/{userId}则不需要认证保护,当然这仅仅是个例子,实际项目中,需要根据需求对那些是敏感资源进行划分。
下面我演示一个实例,首先是对GET的访问不作任何认证。
那么,Restlet是如何实现上述我们描述的情况呢?答案是,需要借助于Guard类。创建Guard的一个子类,然后override Guard的doHandle方法:
@Override
public int doHandle(Request request, Response response) {
if(request.getMethod().equals(Method.GET)){
accept(request, response);
return CONTINUE;
}else{
return super.doHandle(request, response);
}
}
你也许不太明白,稍后解释,先看看源代码里面accept方法:
/**
* Accepts the call. By default, it is invoked if the request is
* authenticated and authorized. The default behavior is to ask to the
* attached Restlet to handle the call.
*
* @param request
* The request to accept.
* @param response
* The response to accept.
*/
public void accept(Request request, Response response) {
// Invoke the attached Restlet
super.doHandle(request, response);
}
看过accept方法的代码,我们知道这是在调用执行attach到当前guard的Restlet。结合我们override的doHandle方法,很明显,如果请求是基于GET的,直接跳过校验,执行后面的Restlet,否则,调用父类的方法进行认证。
基于上述的内容,如果我们要对某些确定的资源Uri进行认证保护,应该如何处理呢?修改doHandle方法,并增加一个检查当前请求的Uri是否是受保护的。
@Override
public int doHandle(Request request, Response response) {
Reference ref = request.getResourceRef();
ref.setBaseRef(request.getRootRef());
if(request.getMethod().equals(Method.GET) || isProtectedUri(ref.getRemainingPart())){
accept(request, response);
return CONTINUE;
}else{
return super.doHandle(request, response);
}
}
private boolean isProtectedUri(String uri){
//do some validation to check the uri is protected
return true;
}
这样,就能实现我们保护确定资源的目的了。
写在后面的话: 虽然上面这种方法确实可以实现资源认证保护,但是我始终认为检测当前Uri是否是受保护的,应该由Restlet来完成,而不应该是用户来写这段代码。从Guard类的代码也能看出来,如果使用Digest做认证的话,构造函数里面的一个参数是baseUris,最初,我想把受保护的Uris放进去,但是测试下来,好像不管用,不知道是我自己这边的理解有问题,还是Restlet真的不支持?
上一篇: web 页面分页打印
下一篇: Xrandr