我在Tomcat中使用Struts2+Spring+Hibernate。
我在用户能够直接输入 .jsp 或 .action 网址时遇到问题。 他们需要访问的所有内容都可以从主页访问,所以我想阻止这种访问。
我一直在寻找答案,我发现了一些东西,特别是与.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>
到我的网络.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>
在我的任何安全角色中。
我听说我可以把我所有的 jsp 都放在/Web-inf 中,但这似乎很麻烦,因为我将不得不更改我引用它们的应用程序的每个实例中的路径。
我也找不到任何涉及阻止直接访问 .action 类的内容。 如果有人可以指出我可以找到这些信息,我们将不胜感激。 谢谢。
如果你把你的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();
}
}
最后,在操作的checkSecurity()
方法中,检查当前用户是否有权调用操作。如果用户没有访问权限,请抛出某种异常(我通常会创建一个名为 AccessViolation
的异常,然后将其映射到自定义错误页面)。
public class YourAction implements SecurableAction {
@Override
public void checkSecurity() {
if (!currentUser.hasPermission("MANAGE_OTHER_USERS")) {
throw new AccessViolation();
}
}
}
请记住将此新拦截器添加到堆栈中。
作为所有这些的替代方案,您也可以使用 Preparable
接口来提供所有这些,但我发现使用单独的方法来封装安全检查会更好。