Java HttpServletRequest isUserInRole无法正常工作(按请求安全性)servlet api 2.4

时间:2015-10-05 11:23:41

标签: java tomcat java-ee servlets resteasy

我正在构建一个由tomcat提供的Web应用程序(使用servlet api 2.4,目前无法切换到servlet api 3.0)。 我正在尝试使用HttpServletRequest.isUserInRole动态保护某个url模式。

我有多个使用web.xml文件保护的servlet:

<servlet-mapping>
    <servlet-name>MySecuredServlet</servlet-name>
    <url-pattern>/my/secured/servlets/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>MyDispatcher</servlet-name>
    <!-- This servlet won't be secured because only some of the servlets this dispatcher calls will be secured -->
    <url-pattern>/my/dispatcher/*</url-pattern>
</servlet-mapping>
...
<security-constraint>
    <web-resource-collection>
        <url-pattern>/my/secured/servlets/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

我还有一些其他的servlet,我无法在web.xml文件中写,因为我在构建时不知道它们。

我正在向一些动态设置的servlet发送请求,其中一些需要授权。

class MyDispatcher extends HttpServlet {
    ...
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
      IOException {

        // I am dispatching requests to dynamically set customServlets which I don't know at build time
        MyCustomServlet customServlet = MyCustomServlets.get(req.getPathInfo());
        if (customServlet != null) {

          if (customServlet.requiresAuthorization()) {
            // isUserInRole is not reliable. It returns false when it should return true. Why?
            if (!req.isUserInRole(ADMIN_ROLE_NAME)) {
              resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
              return;
            }
          }

          customServlet.doGet(req, resp);
        }
    }
}

进一步澄清:

在url-pattern / admin 我提供一个在web.xml文件中受保护的页面。

从该页面我将XMLHttpRequests发送到动态servlet,我希望 isUserInRole 方法返回 true ,因为用户在访问 / admin 最初。

但是isUserInRole会为所有请求返回 false ,直到我刷新浏览器中的 / admin 页面。为什么会这样?我该如何解决?

1 个答案:

答案 0 :(得分:0)

我正在使用JAX-RS的RestEasy实现,所以这个答案可能只适用于RestEasy。

如果一个人没有在请求中调用request.session.getId(),Tomcat似乎不会在请求上设置身份验证cookie。

所以我要做的就是在发出请求之前在请求中调用session.getId()。

之后req.isUserInRole(MY_ROLE)正确返回。