`
ajax
  • 浏览: 251820 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Restlet实战(十七)如何保护确定的资源

    博客分类:
  • REST
Web 
阅读更多

在面向资源的架构中,资源的保护的重要性不言而喻,且不说对那些资源进行新增、修改、删除的操作,就是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真的不支持?

 

 

分享到:
评论
1 楼 andyjackson 2010-05-10  
请问 我在业务代码中 统一使用StringRePresatation()进行数据的交互。我现在想做两个表现层,其中一个是C/S模式,交互还好,那么我怎么重用前面的业务代码,写一个B/S的web page,进行数据交换,貌似使用fk(那个词不允许使用)r需要返回的是TemplateRepresentation的对象。

相关推荐

Global site tag (gtag.js) - Google Analytics