0

本当に大きな問題。再び宿題。私はそれを機能させることをほとんどあきらめました。もう十分な時間はありません。docs.oracle のセキュリティに関するすべて、NetBeans のセキュリティに関するすべて、クラスで提供されるすべて (教科書はこれをカバーしていないため、今回は古い本のせいにすることはできません) を読んでみました。グーグルを介した一連のチュートリアルと、ここでの多くの質問。私はそれを働かせることができません。

私は宿題の答えを探しているわけではありません。もっと調べる必要があることや、見落としている可能性があることを再確認する必要があります....

アプリケーションは、2 つの異なるグループのユーザーがログインできるようにする必要があります。管理者ユーザーはすべてにアクセスできますが、ユーザー ユーザーは /user/* のみにアクセスできます。厳密にプログラムによるセキュリティに制限されることも、特定の宣言型セキュリティに制限されることもありません。ページ フローを制御するためのサーブレットを作成する必要があります (JSF にはコントローラーが付属しており、ページ フローはフレームワークを介して制御できることをインストラクターに伝えたのと同じくらい、彼の決定には影響しませんでした。)保護された領域の 1 つにアクセスしようとすると、ログインするように求められるか、ログイン ページにリダイレクトされるか、セキュリティの実装に基づいてログインに必要なことは何でも行われます。ログインした User ユーザーが管理領域にアクセスしようとすると、管理者ではないというメッセージが表示されます。元の場所に戻すか、ログアウトするか、管理者としてログインするように求められるかについての詳細はありません。唯一の要件は、データベースを使用してユーザー名とパスワードを保存できないことです。

そこで、ファイル レルムに 2 人のユーザーを設定しました。1 人はユーザー、もう 1 人は管理者です。基本認証用に設定しようとしましたが、ユーザーがページを実行したときにログインを求められません。カスタム ログイン/ログイン エラー ページとフォーム認証を作成しようとしましたが、ユーザーがページを実行したときにログイン フォームが表示されませんでした。これまでのところ、ログインページをウェルカムファイルとして使用し、フォーム送信時にサーブレットを呼び出し、request.login(username, password) を使用してユーザーが見つかった場合はログインすることしかできませんでした領域とすべてが一致します。次に、ロールを確認してユーザーの Bean に設定し、割り当てられたロールに基づいて適切な開始ページに転送します。しかし、フォームにデータを入力してログインするために送信せずに実行して別のページに移動すると、ページが表示されます。ユーザー ロールとしてログインし、管理領域のページの 1 つに移動すると、許可されます。URL のセキュリティ制約を設定し、さまざまな URL に対してここで見た例のフィルターを使用しましたが、それらは呼び出されません。

おそらく私が見逃している単純なものがあり、Java以外のhtmlやその他のものを知らないでこのクラスに参加することがおそらく最大の問題であり、正直に言って、私がこのクラスの境界Aである方法がわかりません
....これよりもプロジェクトにもっと多くのことがありますが、残りは私が問題を抱えているとは思わないものですが、私はこの週のほとんどの間、このセキュリティの部分に夢中になっていて、それを開始していません.

web.xml

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Controller</servlet-name>
        <servlet-class>Project2.Controller</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>/Controller</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <security-constraint>
        <display-name>AdminConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>admin</web-resource-name>
            <description/>
            <url-pattern>/admin/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>Admin</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>UserConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>user</web-resource-name>
            <description/>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>User</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
        <description/>
        <role-name>User</role-name>
    </security-role>
    <security-role>
        <description/>
        <role-name>Admin</role-name>
    </security-role>
    </web-app>

login.xhtml

    <f:view>
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>JSP Page</title>
            </head>
            <body>
                <h1><h:outputText value="Welcome!  Choose an action below."/></h1>

                <form method="Post" action="Controller">
                    <h:inputText id="userName" value=""/>
                    <h:inputSecret id="password" value=""/>
                    <h:commandButton value="Login" type="submit"/>
                </form>
            </body>
        </html>
    </f:view>
4

1 に答える 1

0

したがって、あなたの目標に基づいて、コンテナベースの認証と承認を達成するようです。したがって、持っているものに加えて、次のようにデプロイメント記述子にログイン構成を追加する必要もあります。

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>yourRealmName</realm-name>
    <form-login-config>
      <form-login-page>/login.xhtml</form-login-page>
      <form-error-page>/error.xhtml</form-error-page>
    </form-login-config>
</login-config>

上記の構成は、ユーザーがユーザー名とパスワードを入力するログイン ページと、認証が失敗した場合にリダイレクトされるエラー ページを指定します。

login.xhtml で、次のようにフォームを j_security_check に POST するように指定する必要があります。

<form action="j_security_check" method="POST">
  <input type="text" name="j_username" />
  <input type="secret" name="j_password" />
  ...
</form>

コンテナー ベースの認証の代わりに、フォームの送信時にプログラムによる認証を行うこともできます。ユーザーの役割がチェックされ、必要なアクションの結果が返されます。そのコントローラーはもう必要ないと思います。

詳細については、Java EE 6 ドキュメントを参照してください

于 2012-07-08T09:55:06.827 に答える