Java 使用Jersey和ApacheShiro的RESTful Web服务

Java 使用Jersey和ApacheShiro的RESTful Web服务,java,post,jersey,shiro,Java,Post,Jersey,Shiro,我第一次尝试开发一个简单的基于身份验证的REST服务。我正在尝试使用Tomcat8上的Jersey开发一个RESTful web应用程序。我使用ApacheShiro进行会话管理和授权。仅支持HTTPS。 所有服务都需要身份验证,不允许来宾或匿名访问。请求可以通过两种方式进行身份验证 如果该用户属于web应用程序中的用户列表,则该用户从web浏览器登录,Shiro只需验证当前用户是否已登录并允许请求继续。这适用于应用程序本身提供的自定义UI 如果请求来自第三方应用程序,则每个服务请求的用户名/密

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

  • 如果该用户属于web应用程序中的用户列表,则该用户从web浏览器登录,Shiro只需验证当前用户是否已登录并允许请求继续。这适用于应用程序本身提供的自定义UI
  • 如果请求来自第三方应用程序,则每个服务请求的用户名/密码令牌都会传递到HTTP头授权字段中。用户由第三方应用程序管理,该应用程序使用通用用户名/密码供其用户访问web服务。这些普通用户无法登录
  • 过滤所有服务请求(web.xml):

    我有一个web服务,它接受表单参数并创建资源。表单参数是基于用户选择的动态参数。因此,我无法使用@FormParam获取所有参数。此外,随着新功能的添加,可能会形成更多内容,因此我不想为每个新的/删除的参数再次触摸服务

    我正在使用Chrome高级REST客户端插件模拟第三方请求。对于第一个场景(登录用户),任何浏览器都可以。 现在我只知道了两种访问表单参数的方法

    第一种方法是使用
    多值dmap

    @POST
    @Path("/create")
    public String createResource(MultivaluedMap<String, String> parameters) {
        System.out.println("Name of the resource: " + parameters.getFirst("resourceName"));
    }
    
    这适用于REST客户端,但在登录用户提交表单时不起作用。所有request.getParameter返回null

    如果有人知道如何解决问题或更好地进行身份验证,请让我知道

    @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;
    }
    
    @POST
    @Path("/create")
    public String createResource(MultivaluedMap<String, String> parameters) {
        System.out.println("Name of the resource: " + parameters.getFirst("resourceName"));
    }
    
    @POST
    @Path("/create")
    public String createResource(@Context HttpServletRequest request) {
        System.out.println("Name of the resource: " + request.getParameter("resourceName"));
    }