我首次尝试开发基于身份验证的简单REST服务。我正在尝试使用Tomcat 8上的Jersey开发RESTful Web应用程序。我正在使用Apache Shiro进行会话管理和授权。仅支持HTTPS 所有服务都需要身份验证,不允许访客或匿名访问。请求可以通过两种方式进行身份验证。
过滤所有服务请求(web.xml):
<servlet>
<servlet-name>REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.unisys.cpf.ffm.filter.AuthenticationFilter</param-value>
</init-param>
</servlet>
<servlet-mapping>`enter code here`
<servlet-name>REST Service</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
AuthenticationFilter
类实现ContainerRequestFilter
进行身份验证:
@Override
public ContainerRequest filter(ContainerRequest cr) {
Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {
//User is not logged in so get the authorization from header and authenticate
String auth = cr.getHeaderValue("authorization");
//Do Shiro authentication here.
}
return cr;
}
我有一个Web服务,它接受表单参数并创建资源。 Form参数是动态的,基于用户选择的内容。所以我不能使用@FormParam来获取所有参数。此外,可能会有更多内容在添加新功能时形成,因此我不想再为每个新的/删除的参数触摸服务。
我正在使用Chrome Advanced REST Client插件来模拟第三方请求。任何浏览器都适用于第一种情况(登录用户)。 现在我只知道两种访问表单参数的方法。
第一种方法是使用MultivaluedMap
。
@POST
@Path("/create")
public String createResource(MultivaluedMap<String, String> parameters) {
System.out.println("Name of the resource: " + parameters.getFirst("resourceName"));
}
但尝试使用MultivaluedMap
获取参数仅在登录用户提交表单时才有效。如果我从REST Client插件提交相同的表单值,则所有参数都返回null。
第二种方法是使用@Context HttpServletRequest
@POST
@Path("/create")
public String createResource(@Context HttpServletRequest request) {
System.out.println("Name of the resource: " + request.getParameter("resourceName"));
}
这适用于REST客户端,但如果登录用户提交表单则不起作用。所有request.getParameter都返回null。
如果有人知道如何解决问题或更好的身份验证方式,那么请告诉我。