我正在开发一个基于 RESTful WebServices 的 WebApplication。我使用 NetBeans“新文件管理器”自动生成“来自数据库的实体类”和“来自实体类的 RESTful Web 服务”,所以一切都很好,我得到了类似的东西:
@Stateless
@Path("usuario")
public class UsuarioFacadeREST extends AbstractFacade<Usuario> {
@PersistenceContext(unitName = "TSERMEXeCommercePU")
private EntityManager em;
public UsuarioFacadeREST() {
super(Usuario.class);
}
@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(Usuario entity) {
super.create(entity);
}
@PUT
@Override
@Consumes({"application/xml", "application/json"})
public void edit(Usuario entity) {
super.edit(entity);
}
@DELETE
@Path("{id}")
public void remove(@PathParam("id") Integer id) {
super.remove(super.find(id));
}
@GET
@Path("{id}")
@Produces({"application/xml", "application/json"})
public Usuario find(@PathParam("id") Integer id) {
return super.find(id);
}
@GET
@Override
@Produces({"application/xml", "application/json"})
public List<Usuario> findAll() {
return super.findAll();
}
我的数据库上的每个实体都有 REST 服务。所以到目前为止一切都很顺利。
但是我有一个小问题,我需要每个服务调用来检查用户是否登录以及他是否有权调用该服务,例如:
我将在我的 UsuarioFacadeREST 上有一个名为 logIn() 的额外服务,它接收用户、密码,如果它正确,我将在他的 HTTPSession 中添加一个“logedIn:true”参数,这样我就可以随时知道他是否已经登录,类似:
@GET
@Path("login/{user}/{pass}")
@Produces({"application/xml"})
public String logIn(@PathParam("user") String user, @PathParam("pass") String pass, @Context HttpServletRequest request) {
Usuario userEntity;
if( (userEntity = getUserFromDB(user, pass)) != null ) {
HttpSession session = request.getSession();
session.setAttribute("logedIn", true);
session.setAttribute("priviledges", loadPrivilegdesList(userEntity));
return "<logedIn>true</logedIn>";
} else {
return "<logedIn>false</logedIn>";
}
}
因此,一旦他登录,我就会在他的会话中加载他的权限列表。
这些权限是字符串,如“VIEW_CUSTOMER_LIST”、“ADD_CUSTOMER”、“EDIT_CUSTOMER”、“DELETE_CUSTOMER”、“ADD_PRODUCT”、“EDIT_PRODUCT”等。
这是什么意思?这意味着在我的 CustomerFacadeREST 服务上,对于每个 REST 服务(每个函数调用),我都需要检查用户登录状态和他的权限列表。通过这种方式,我将能够知道我是否可以为用户提供这项服务,或者我必须拒绝他。
问题是,如果 HttpSession 具有属性已登录,我认为编辑所有自动生成的 RESTful Web 服务以检查每个函数不是一个好习惯。
所以,我想知道是否有任何方法可以为所有 RESTful Web 服务提供服务调用前功能,该功能在每次服务调用时检查 HttpSession 的 logedIn 属性。我的意思是,我想锁定所有 webServices 调用并将它们重定向到此函数,以便它检查我需要检查的内容,然后调用用户调用的原始函数。
有没有办法解决这个问题?
非常感谢您的阅读。如果我不够清楚,请告诉我。