欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-05 09:10:17
...

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

上一篇: web 页面分页打印

下一篇: Xrandr