未考虑基于注释的Servlet安全性

时间:2016-10-11 14:35:52

标签: security servlets java-ee websphere

我试图保护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之外构建和部署它,那么它按预期工作。我将尝试比较两种方法之间的已部署工件和部署描述符,以查看是否可以发现差异。

1 个答案:

答案 0 :(得分:0)

好的,好像我错过了指定虚拟主机的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>

之后一切都按预期工作。

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