在面向资源的架构中,资源的保护的重要性不言而喻,且不说对那些资源进行新增、修改、删除的操作,就是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真的不支持?
分享到:
相关推荐
本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...
在Restlet中,资源由`org.restlet.resource.ServerResource`或`org.restlet.resource.ClientResource`类表示,负责处理请求并返回响应。 3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式...
RESTlet是一款开源框架,专为构建基于REST(Representational State Transfer)原则的Web服务和应用程序设计。REST是一种轻量级的架构风格,广泛应用于互联网应用的开发,它强调通过简单的HTTP方法(如GET、POST、...
在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...
通过这个基本认证的例子,开发者可以了解Restlet框架如何与HTTP协议的认证机制结合,以及如何在实际应用中保护资源的安全。理解这一概念对于开发安全的REST服务至关重要,特别是在处理敏感数据或需要授权访问的场景...
3. **定义路由**:在Restlet应用中,你需要创建一个路由(Route)来映射URL到对应的资源。这可以通过创建一个Application类来完成。 ```java import org.restlet.Application; import org.restlet.Restlet; ...
1. **Restlet**: 是框架的基本构建块,代表了REST架构中的资源。一个Restlet可以响应特定的URI,处理HTTP请求,并返回适当的响应。 2. **Client/Server Connector**: 这些组件允许Restlet与网络进行交互,处理...
### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅...
在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,它们响应客户端的请求并提供响应。资源通过代表者(Representation)来表达其状态,代表者可以是文本、图像或其他任何形式的数据。 1. GET...
Restlet是一款强大的开源框架,专为构建RESTful(Representational State Transfer)Web服务而设计。REST是一种轻量级的架构风格,广泛应用于Web应用程序的开发,以提高性能、可伸缩性和可维护性。本系列的开发实例...
- 整合Restlet的资源、过滤器和路由器。 - 实现一个完整的Restlet应用案例。 - **第四章:本地部署Restlet应用**: - 在本地Java SE环境或Java EE服务器上部署应用。 - 测试和调试已部署的应用。 #### 五、参考...
此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的Web服务也是十分必要的。 总之,"Restlet所需要的所有jar包"的压缩包提供了开发RESTful服务的基础环境...
org.restlet.jar
《深入理解org.restlet-2.3.0.jar:Java RESTful开发的得力助手》 在Java开发领域,REST(Representational State Transfer)架构风格已经成为构建Web服务的主流选择,而org.restlet-2.3.0.jar则是实现RESTful API...
第五章“Securing a Restlet application”则深入探讨了如何保护Restlet应用免受安全威胁。内容包括但不限于身份验证机制、授权策略以及如何实施加密技术来保障数据的安全传输。对于任何关心自己服务安全性的开发者...
- 创建Restlet资源:介绍如何定义资源类以及实现HTTP方法的处理逻辑。 - 部署与测试:演示如何将Restlet应用程序部署到服务器上,并进行基本的功能性测试。 3. **第3章:部署Restlet应用程序**(Deploying a ...
Restlet是Java领域的一款开源框架,专门用于构建REST(Representational State Transfer)风格的Web服务。RESTful是一种软件架构风格,设计模式,是基于HTTP协议的Web服务设计原则,强调资源的概念,通过URI来定位...