【问题标题】:Java HttpServletRequest isUserInRole not working properly (per request security) servlet api 2.4Java HttpServletRequest isUserInRole 无法正常工作(每个请求安全)servlet api 2.4
【发布时间】:2016-01-02 00:54:57
【问题描述】:

我正在构建一个由 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 文件中受保护的页面。

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

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

【问题讨论】:

    标签: java tomcat jakarta-ee servlets resteasy


    【解决方案1】:

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

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

    所以我必须做的是在发出我自己的请求之前在请求中调用 session.getId()。

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

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2014-04-21
      • 1970-01-01
      • 2017-09-01
      • 2014-06-08
      相关资源
      最近更新 更多