0

私のWebアプリケーションには、2つの主要なセクションがあります

  1. ユーザー
  2. 管理者

Java セッション フィルターを使用してユーザー セッションを確認し、Web サイトの特定の部分へのアクセスを許可しています。したがって、ユーザーはユーザー ページ セクションにのみアクセスでき、管理者は管理セクションにアクセスできます。

ユーザーのセッション フィルターは既に実装されており、正常に動作します。ユーザー(データベースからのユーザー名とパスワード-mysql)をチェックし、xhtmlページがある制限付きサブフォルダーへのアクセスを許可します。

フィルターで管理セクションの認証を確認し (管理者のユーザー名とパスワードは db に保存されます)、ユーザー レベルに基づいてアクセスを許可する場合。

もう 1 つのフィルターを作成する必要がありますか? - 管理者?

現在、ユーザーの実装は次のとおりです。

package com.shadibandhan.ControllerLayer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Cookie;

/**
 *
 * @author MUDASSIR
 */
public class SessionFilter implements Filter {

    private ArrayList<String> urlList;
    private String toGoTo = null;
    private boolean userCookieExists = false;

    @Override
    public void init(FilterConfig config) throws ServletException {

        System.out.println("****************************************");
        System.out.println("***Session Filter Servlet initialized***");
        System.out.println("****************************************");
        String urls = config.getInitParameter("avoid-urls");
        System.out.println("The urls to avoid are = " + urls);
        StringTokenizer token = new StringTokenizer(urls, ",");

        urlList = new ArrayList<String>();

        while (token.hasMoreTokens()) {
            urlList.add(token.nextToken());

        }
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {

        System.out.println("This is the doFilter method");

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String contextRelativeURI = null;
        String contextRelativeURIForAdmin = null;



            contextRelativeURI = request.getRequestURI().substring(request.getContextPath().length());


        String contextPath = request.getContextPath();
        String remoteHost = request.getRemoteHost();
        String url = contextPath + contextRelativeURI;
        System.out.println("-----------------> Servlet path is = " + contextRelativeURI);
        System.out.println("-----------------> Context path is " + contextPath);
        System.out.println("-----------------> URL is " + url);
        System.out.println("-----------------> Remote Host is " + remoteHost);
        boolean allowedRequest = false;

        if (urlList.contains(contextRelativeURI)) {
            allowedRequest = true;
        }

        if (!allowedRequest) {
            HttpSession session = request.getSession(false);
            if (null == session) {

                System.out.println("Session is not present");
                response.sendRedirect(contextPath);
                return;

            }
            if (null != session) {

                System.out.println("Session is present");
                System.out.println("\nSession no. is = " + session.getId());

                if (session.getAttribute("logged-in") == "true") {
                    System.out.println("Session logged-in attribute is true, " + session.getAttribute("sessionUsername") + " is logged in.");



                        RequestDispatcher dispatcher = request.getRequestDispatcher(contextRelativeURI);
                        dispatcher.forward(request, response);
                        return;
                } else {
                    System.out.println("Session logged-in attribute is not true");
                    response.sendRedirect(contextPath);
                    return;
                }
            }
        }

        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {
    }
}

これはフィルターの web.xml マッピングです

<filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>
            com.shadibandhan.ControllerLayer.SessionFilter
        </filter-class>
        <init-param>
            <param-name>avoid-urls</param-name>
            <param-value></param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/com.shadibandhan.Restricted/*</url-pattern>
    </filter-mapping>

さて、管理ページも制限付きフォルダーに入れますか? または私はそれらを別の別のフォルダに入れますか?ここで言及されているサーブレット認証方法も見ました。これは tomcat-users.xml ファイルの変更を推奨していますが、データベースにユーザー名とパスワードがあります。

おすすめの方法を教えてください。

4

1 に答える 1

0

Web アプリケーションを保護する最善の方法は、コンテナー管理認証を使用 することです。これにより、アプリケーションは認証および承認メカニズムを処理する必要がなくなります。そのメカニズムは、Java の世界ではJAASと呼ばれます。

コンテナー管理認証を使用するには、通常、Web アプリケーションで必要な変更とは別に、サーブレット アプリケーションで少し構成を行う必要がありますが、より安全になります。あなたは Tomcat を使用していると言ったので、そのサーブレット コンテナーに基づいてできる最善の答えを提供します。他のものは別の方法で構成されています。

1.Tomcat レルムを構成する

まず第一に、tomcat-users.xml(安全ではない) のことは忘れて、認証データ、LDAP サーバーをどのように保存するかを決めますか? データベース?どのデータベース?. 決定したら、Tomcat のフォルダーのserver.xml下にあるファイルを変更して、新しいレルムconfを追加する必要があります。作成するレルムのタイプは、以前の決定によって異なります。

ユーザーをストレージに追加します。

2. Web アプリケーションを構成する

ここで、Web アプリケーション側で認証方法を構成する必要があります。これは、 のweb.xml下のファイルを変更して行われます/WEB-INF

基本認証またはフォームベース認証のいずれかを選択できます。エンド ユーザーにカスタマイズされたフォームを提供できるので、私は後者を使用することを好みます。

ここで提供しているリンクの一部は、プロセスを段階的に説明しています。また、アプリケーションの一部へのアクセスをさまざまな種類のユーザーに制限する方法に関する情報も含まれています。

<security-constraint>
  <web-resource-collection>
    <web-resource-name>AdminPages</web-resource-name>
    <description> accessible by authorised users </description>
    <url-pattern>/admin/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
    <description>These are the roles who have access</description>
    <role-name>ADMIN</role-name>
  </auth-constraint>
</security-constraint>

3. ユーザーを知る

getRemoteUser()すべての設定が完了したら、アプリケーションは のメソッドを使用してユーザー名を認識できるはずHttpServletRequestです。

編集:

管理者とユーザーに同じテーブルを使用し、役割を使用してそれらを区別することをお勧めします。admin通常のユーザーが利用できない追加のフィールドがエンティティに必要な場合は、両方のテーブルをリンクし、返されたadminときに一方を処理するだけです。HttpServletRequest.isUserInRole("ADMIN")true

于 2012-07-24T22:54:41.163 に答える