security - 阻止直接访问 Struts2 中的 *.jsp 和 *.action

标签 security jsp struts2

我在 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 放在/WEB-INF 目录下,则将无法直接访问它们。

至于 .actions,你运气不好——你无法阻止某人直接访问网页的 URL(这就是 .action 最终的样子)。

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

更新

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

这是一个例子:

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 接口(interface)来提供所有这些功能,但我发现使用单独的方法来封装安全检查会更好。

关于security - 阻止直接访问 Struts2 中的 *.jsp 和 *.action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972892/

相关文章:

security - Internet Explorer 阻止此网站显示安全证书错误的内容

Python Pexpect 和 Check Point Gaia 专家模式

服务器上的 Javascript 安全性

mysql - 在JSP中使用JSTL显示具有连接的查询结果

java - 如何在 Struts 2 中仅获取特定字段作为响应

java - Struts 2 操作错误 - 无法继续到下一页

c# - DLL 中公共(public)类的私有(private)属性是否安全

java - 如何将 API 端点添加到我正在处理的 jsp 项目中?

java - 如何使用struts2统计从数据库中找到的记录数并显示在jsp页面中?

java - Struts 2中的ActionContext对于当前请求来说是唯一的吗?