2

Tomcat でのユーザー ログインに基づいて、一部のコード機能を非表示にしたいと考えています。基本認証を使用しています。助言がありますか?

4

1 に答える 1

8

ユーザーがログインしているかどうかに応じて一部のリソースを非表示にするだけの場合は、一部のページへのアクセスを制限するだけです (以下の参照を参照)。

ログインしているユーザーに基づいて一部の機能を非表示にする場合、解決策の 1 つは、JSP 内でユーザー ロールを確認し、それに応じてコンテンツを出力することです。

基本的な例:
sample.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
    <title>Sample Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <c:choose>
        <c:when test="${pageContext.request.isUserInRole('admin')}">
            <p>Content for admin.<p>
        </c:when>
        <c:when test=${pageContext.request.isUserInRole('someRole')}">
            <p>Some content here</p>
        <c:when>
        <c:otherwise>
            <p>Another Content</p>
        </c:otherwise>
    </c:choose>
</body>
</html>

注意!
EL を使用して引数を指定してメソッドを呼び出せるようにするには、最低限のサーブレット バージョン 3を使用する必要があります。
ここからの引用: https://stackoverflow.com/tags/el/info

Servlet 3.0 / JSP 2.2 (Tomcat 7、Glassfish 3、JBoss AS 6 など) の一部として維持されている EL 2.2 以降、必要に応じて引数を使用して非 getter メソッドを呼び出すことができます。


ユーザーの役割に応じて一部のページへのアクセスを非表示/制限する別の方法は、 web.xmlでセキュリティ構成を作成するか、注釈 (最小 Java EE 5) を使用するか、作成するユーザーの役割をチェックする独自のフィルターを作成することです。リクエスト。

独自のFilterを作成するには、 javax.servlet.Filterインターフェイスを実装するクラスを作成し、 doFilter()メソッドで HttpServletRequest メソッド isUserInRole ( )を使用してリクエストを行ったユーザーのロールを確認します。

カスタムFilterを実装する簡単な例を次に示します

package com.example.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet Filter implementation class RoleCheckFilter.
 * Its purpose is to check logged-in user's role and
 * and accordingly allow or prevent access to the web resources.
 */
public class RoleCheckFilter implements Filter {

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig filterConfig) throws ServletException {}

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (request.isUserInRole("admin")) {
            // user have the appropriate rights, allow the request
            chain.doFilter(request, response);
        } else {
            // user does not have the appropriate rights, do something about it
            request.setAttribute("error", "You don't have enough rights to access this resource");
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            // or you could forward a user request somewhere
        }
    }


    /**
     * @see Filter#destroy()
     */
    public void destroy() {}

}

web.xmlに適切なフィルター構成を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    ...

    <filter>
        <filter-name>Role Check Filter</filter-name>
        <filter-class>com.example.filter.RoleCheckFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Role Check Filter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    ...

</web-app>

もちろん、あなたの場合、基本認証を使用するという事実を考慮すると、 web.xml (宣言型セキュリティ)でセキュリティ構成を行うか、プログラムによるセキュリティを使用する方がはるかに簡単です。

公式の Java EE ドキュメントからの引用:

Java EE セキュリティ サービスは、次の方法で Web アプリケーションに実装できます。

  • メタデータ アノテーション(または単にアノテーション) は、クラス ファイル内のセキュリティに関する情報を指定するために使用されます。アプリケーションがデプロイされると、この情報は、アプリケーションのデプロイメント記述子によって使用またはオーバーライドできます。

  • 宣言型セキュリティは、セキュリティ ロール、アクセス制御、認証要件などのアプリケーションのセキュリティ構造を、アプリケーションの外部にあるデプロイメント記述子で表現します。
    デプロイメント記述子で明示的に指定された値は、アノテーションで指定された値をオーバーライドします。

  • プログラムによるセキュリティはアプリケーションに組み込まれており、セキュリティの決定に使用されます。プログラムによるセキュリティは、アプリケーションのセキュリティ モデルを表現するのに宣言型のセキュリティだけでは不十分な場合に役立ちます。


Java EE アプリケーションの保護に関連する公式の Java EE ドキュメントを確認してください (この場合は、Authorization Constraint の指定部分に注意してください):
Java EE 6: Web アプリケーションの保護
Java EE 5: Web アプリケーションの保護

公式ドキュメントの例も確認してください:
Java EE 6. 例: Web アプリケーションを保護する
Java EE 5. 例: Web アプリケーションを保護する

于 2013-01-15T23:49:07.093 に答える