【发布时间】:2017-02-20 03:28:21
【问题描述】:
我试图保护一个 servlet,只允许访问角色为 MY_ROLE 的用户(所有经过身份验证的用户都被赋予角色 MY_ROLE)。我的 Servlet 看起来像这样:
@WebServlet(name = "remoting", loadOnStartup = 1, urlPatterns = { "/remoting/*" })
@ServletSecurity(@HttpConstraint(rolesAllowed = { "MY_ROLE" }))
public class MyRemotingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
}
}
尽管有这样的配置,我仍然可以访问这个 Servlet 公开的 URL,甚至不需要进行身份验证。我发现强制身份验证并因此控制对 servlet 的访问的唯一方法是创建一个包含以下内容的 web.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="MyWar" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<security-constraint>
<display-name>remoting</display-name>
<web-resource-collection>
<web-resource-name>remoting</web-resource-name>
<url-pattern>/remoting/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>MY_ROLE</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>MY_ROLE</role-name>
</security-role>
</web-app>
我的问题是:web.xml 文件真的有必要还是我在我的 servlet 定义中做错了什么?
WebSphere 8.5.5.3 版本。
编辑:
未提供时生成的web.xml部署描述符如下:
<web-app id="WebApp_ID" version="3.0"
metadata-complete="false"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" >
<display-name>MyWar</display-name>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>MyRemotingServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<enabled>True</enabled>
<async-supported>False</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<security-role>
<description>generated from RolesAllowed of ServletSecurity annotation</description>
<role-name>MY_ROLE</role-name>
</security-role>
</web-app>
编辑 2:
启动时显示以下警告:
com.ibm.ws.amm.scan.util.AnnotationInfoDefaultVisitor visitAnnotation [ com.ibm.ws.amm.scan.util.InfoVisitor@261721818 ] 用于方法 [ com.ibm.ws.amm.scan.util.info.impl.MethodInfoImpl@1945169957 ( javax.servlet.annotation.ServletSecurity.value)] 名称 [null] 描述 [ Ljavax/servlet/annotation/HttpConstraint; ] 呼入 违反协议
编辑 3(解决方法):
看起来问题出在我使用 m2e 和 IBM WebSphere Developer Tools for Eclipse 直接从 Eclipse 构建和部署我的应用程序这一事实。如果我在 Eclipse 之外构建和部署它,那么它会按预期工作。我将尝试比较两种方法之间部署的工件和部署描述符,看看是否能发现差异。
【问题讨论】:
-
这看起来像一个错误,相同的代码在 WebSphere Liberty 中运行良好。你应该提高 PMR。
-
能否请您尝试添加@DeclareRoles("MY_ROLE") 注释并尝试。在使用角色允许注释时,我看到是否需要声明角色的混合行为。注释应该可以工作,你不需要 web.xml
-
您有机会尝试添加@DeclareRoles。这有帮助吗?
-
我确实试过了,唯一的区别是部署描述符中出现了另一个
<security-role>标签,但行为不受影响
标签: security servlets jakarta-ee websphere