2

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 クラスへの直接アクセスをブロックすることに関するものも見つかりません。この情報を見つけるために私が指摘できる人がいるなら、それは大歓迎です. ありがとう。

4

1 に答える 1

5

JSP を /WEB-INF ディレクトリに配置すると、直接アクセスできなくなります。

.actions に関しては、運が悪いです。誰かが Web ページの URL に直接アクセスするのを止めることはできません (最終的には .action です)。

ユーザーが URL に直接アクセスできないようにする必要があるのはなぜですか? 物事に直接リンクできることは、Web のかなり基本的な部分です。

アップデート

アクセスを制御する方法を探しているので、インターフェースを作成してからインターセプターを作成できます。インターセプターで、現在のアクションがインターフェイスを実装しているかどうかを確認し、実装している場合は、インターフェイスでメソッドを呼び出します。

次に例を示します。

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インターフェイスを使用してこれらすべてを提供することもできますが、セキュリティ チェックをカプセル化する別の方法を用意する方がよいと思います。

于 2012-08-15T16:12:30.980 に答える