【问题标题】:Block direct access to *.jsp and *.action in Struts2在 Struts2 中阻止对 *.jsp 和 *.action 的直接访问
【发布时间】:2012-08-15 16:06:47
【问题描述】:

我在Tomcat中使用Struts2+Spring+Hibernate。

我遇到了用户无法直接输入 .jsp 或 .action url 的问题。他们需要访问的所有内容都可以从主页访问,所以我想阻止这种访问。

我一直在寻找答案,并找到了一些东西,尤其是与 .jsp 阻塞有关的东西。我已经添加了

<security-constraint>
<web-resource-collection>
<web-resource-name>Deny Direct Access</web-resource-name>
<description></description>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Denied</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>Denied</role-name>
</security-role>

到我的 web.xml,但这似乎没有任何作用。然后我变了

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping> 

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
    <url-pattern>*.html</url-pattern>
    <url-pattern>/index.jsp</url-pattern>
</filter-mapping> 

这会阻止一些 .jsp 文件,但不会阻止其他文件。我确定不放

<url-pattern>*.jsp</url-pattern>

担任我的任何安全角色。

我听说我可以将所有 jsps 放在 /Web-inf 中,但这似乎很麻烦,因为我必须在我引用它们的每个应用程序实例中更改路径。

我也找不到任何涉及阻止直接访问 .action 类的内容。如果有人可以指点我找到此信息,将不胜感激。谢谢。

【问题讨论】:

  • 为什么在配置文件之外的任何地方直接引用 JSP 页面?
  • 我没有,它们只用在 .xml 文件中
  • 那么我看不出有什么大不了的——使用正则表达式在 JSP 文件名前加上 /WEB-INF/
  • 是的,这是最快的解决方案。谢谢。

标签: security jsp struts2


【解决方案1】:

如果您将 JSP 放在 /WEB-INF 目录下,那么它们将无法直接访问。

至于 .actions,你不走运 - 你无法阻止某人直接访问网页的 URL(这就是 .action 的最终含义)。

为什么要阻止人们直接访问 URL?能够直接链接到事物是网络的一个非常基本的部分。

更新

由于您正在寻找一种控制访问的方法,您可以创建一个接口,然后创建一个拦截器。在拦截器中,检查当前action是否实现了接口,如果实现了,调用接口上的方法。

这是一个例子:

public interface SecurableAction {
  void checkSecurity();
}

public class SecurityInterceptor extends AbstractInterceptor {
  @Override
  public String intercept(ActionInvocation invocation) throws Exception {
    Object action = invocation.getAction();
    if (action instanceof SecurableAction) {
        ((SecurableAction) action).checkSecurity();
    }

    return invocation.invoke();
  }
}

最后,在您的操作的checkSecurity() 方法中,检查当前用户是否有权调用该操作。如果用户无权访问,则抛出某种异常(我通常创建一个名为 AccessViolation 的异常,然后将其映射到自定义错误页面)。

public class YourAction implements SecurableAction {
  @Override
  public void checkSecurity() {
    if (!currentUser.hasPermission("MANAGE_OTHER_USERS")) {
      throw new AccessViolation();
    }
  }
}

记得将这个新的拦截器添加到你的堆栈中。

作为所有这些的替代方案,您也可以使用Preparable 接口来提供所有这些,但我发现有一个单独的方法来封装安全检查会更好。

【讨论】:

  • 我要阻止 .actions 的两个原因 1. 并非所有安全角色都可以访问所有操作。我可以通过检查角色和重定向将每个操作设置为受保护,但这需要很长时间 2. 有些操作只能从另一个操作访问,例如搜索操作只能从条件操作访问。
  • @user1287523 然后你需要某种形式的工作流管理。种类繁多,或者您可以使用简单的会话令牌和注释来快速滚动,例如。
  • @Steve 你是对的,问题是关于授权和身份验证。如果用户直接使用拦截器进行操作,我们可以限制用户。请相应地更新您的答案。
  • @MohanaRaoSV 如何使用拦截器来限制对某些操作的直接访问?
  • 我修改了我的答案以提供一个例子。
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多