使用Jersey和Apache Shiro的RESTful Web服务

时间:2014-12-07 06:17:11

标签: java post jersey shiro

我首次尝试开发基于身份验证的简单REST服务。我正在尝试使用Tomcat 8上的Jersey开发RESTful Web应用程序。我正在使用Apache Shiro进行会话管理和授权。仅支持HTTPS 所有服务都需要身份验证,不允许访客或匿名访问。请求可以通过两种方式进行身份验证。

  1. 如果用户属于Web应用程序中的用户列表,则用户从Web浏览器登录,Shiro只会验证当前用户是否已登录并允许继续请求。这适用于应用程序本身提供的自定义UI。
  2. 如果请求来自第三方应用程序,则用户名/密码令牌将传递到每个服务请求的HTTP标头授权字段。用户由第三方应用程序管理,应用程序使用通用用户名/密码为其用户访问Web服务。这些普通用户无法登录。
  3. 过滤所有服务请求(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。

    如果有人知道如何解决问题或更好的身份验证方式,那么请告诉我。

0 个答案:

没有答案