我在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>
到我的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类的任何内容。如果有人可以指出我找到这些信息,我将不胜感激。感谢。
答案 0 :(得分:5)
如果将JSP放在/ WEB-INF目录下,则无法直接访问它们。
至于.actions,你在那里运气不好 - 你无法阻止某人直接进入网页的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
接口来提供所有这些,但我发现使用单独的方法来封装安全检查会更好。