【问题标题】:Annotation-based Servlet security not taken into account未考虑基于注解的 Servlet 安全性
【发布时间】: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。这有帮助吗?
  • 我确实试过了,唯一的区别是部署描述符中出现了另一个&lt;security-role&gt;标签,但行为不受影响

标签: security servlets jakarta-ee websphere


【解决方案1】:

好吧,我好像错过了一个指定虚拟主机的 WEB-INF/ibm-web-bnd.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-bnd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://websphere.ibm.com/xml/ns/javaee"
  xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
  version="1.0">

  <virtual-host name="default_host" />

</web-bnd>

之后一切都按预期工作。

让我感到困惑的是,如果没有绑定文件,应用程序仍然可以成功部署,并且在 Web 控制台中显示 War 模块与虚拟主机 default_host 相关联。此外,如果web.xml 存在并且包含安全约束信息,则不需要绑定文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2018-02-13
    • 2013-03-23
    • 2013-07-29
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多