Java HttpServletRequest isUserInRole 无法正常工作(根据请求安全性)servlet api 2.4
Java HttpServletRequest isUserInRole not working properly (per request security) servlet api 2.4
我正在构建一个由 tomcat 提供服务的 Web 应用程序(使用 servlet api 2.4,目前无法切换到 servlet api 3.0)。
我正在尝试使用 HttpServletRequest.isUserInRole.
动态保护某个 url-pattern
我有多个使用 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 方法到 return true 因为用户最初访问 /admin 时已通过身份验证。
But isUserInRole returns false 对于所有请求,直到我在浏览器中刷新 /admin 页面。为什么会这样?我该如何解决?
我正在使用 JAX-RS 的 RestEasy 实现,所以这个答案可能只对 RestEasy 有效。
如果不对请求调用 request.session.getId(),Tomcat 似乎不会对请求设置身份验证 cookie。
所以我要做的是在发出自己的请求之前在请求中调用 session.getId()。
之后req.isUserInRole(MY_ROLE)正确返回。
我正在构建一个由 tomcat 提供服务的 Web 应用程序(使用 servlet api 2.4,目前无法切换到 servlet api 3.0)。 我正在尝试使用 HttpServletRequest.isUserInRole.
动态保护某个 url-pattern我有多个使用 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 方法到 return true 因为用户最初访问 /admin 时已通过身份验证。
But isUserInRole returns false 对于所有请求,直到我在浏览器中刷新 /admin 页面。为什么会这样?我该如何解决?
我正在使用 JAX-RS 的 RestEasy 实现,所以这个答案可能只对 RestEasy 有效。
如果不对请求调用 request.session.getId(),Tomcat 似乎不会对请求设置身份验证 cookie。
所以我要做的是在发出自己的请求之前在请求中调用 session.getId()。
之后req.isUserInRole(MY_ROLE)正确返回。