阻止在Struts2中直接访问*.jsp和*.action

use*_*523 2 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>
Run Code Online (Sandbox Code Playgroud)

到我的web.xml但似乎没有做任何事情.然后我改变了

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping> 
Run Code Online (Sandbox Code Playgroud)

<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> 
Run Code Online (Sandbox Code Playgroud)

它阻止了一些.jsp文件而不是其他文件.我确定不要放

<url-pattern>*.jsp</url-pattern>
Run Code Online (Sandbox Code Playgroud)

在我的任何安全角色中.

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

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

Ste*_*tez 5

如果将JSP放在/ WEB-INF目录下,则无法直接访问它们.

至于.actions,你运气不好 - 你无法阻止某人直接进入网页的URL(这最终是一个.action).

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

更新

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

这是一个例子:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

请记住将这个新的拦截器添加到您的堆栈中.

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

  • @ user1287523然后你需要某种形式的工作流程管理.存在多种类型,或者您可以使用简单的会话令牌和注释来快速滚动. (2认同)