我正在构建一个由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 页面。为什么会这样?我该如何解决?
答案 0 :(得分:0)
我正在使用JAX-RS的RestEasy实现,所以这个答案可能只适用于RestEasy。
如果一个人没有在请求中调用request.session.getId(),Tomcat似乎不会在请求上设置身份验证cookie。
所以我要做的就是在发出请求之前在请求中调用session.getId()。
之后req.isUserInRole(MY_ROLE)正确返回。