让我描述一个简单的场景:
此URI表示一个rest资源:/ api / messages / {userid}。用户登录后,将调度请求,并传递给此URI" userid" (已登录的用户)。这样,一旦用户登录,他就会根据自己的ID获取自己的消息。
如果用户尚未登录,则URI不可见(有验证过滤器)。
问题是:如果已经登录的用户发现了这个uri,他可以提交传递另一个ID的请求,这将导致安全问题,因为他将能够从另一个用户获取消息(只是传递任何随机ID)。
您能提出任何安全模型来防止此安全漏洞吗? (我认为它更可能是一个贯穿各领域的问题)。
先谢谢!
答案 0 :(得分:0)
就在我的脑海中,让端点(a)只返回登录用户可见的消息,或者(b)仅当登录用户与userId中的用户相同时才返回消息URI。哪一个取决于您的业务规则。
答案 1 :(得分:0)
在端点中,您可以检查用户,然后查看该用户ID是否与pathparam匹配 从用户名中查找userid就像使用数据库中的用户名
选择id一样简单import javax.ws.rs.core.Context;
import javax.ws.rs.core.SecurityContext;
import ... blablabla;
@GET
@Path("messages/{userid}")
public Response getMessages( @PathParam("userid") int userId, @Context SecurityContext context ) {
String username = context.getUserPrincipal().getName();
int id = getIdFromName(username); // define this yourself
if(userId==id) {
// output the message list
List<Message> msgs = getDemMessagesGURL(); // define this yourself
return Response.ok(new GenericEntity<List<T>>(msgs) {}).build();
} else {
// output Forbidden(403)
return Response.status(403).build();
}
}
并且使用oauth,您可以使用servlet过滤器根据oauth signiture设置用户主体