Jsp-security
JSP-セキュリティ
JavaServer Pagesとサーブレットは、Web開発者がアプリケーションを保護するためにいくつかのメカニズムを利用できるようにします。 リソースは、アプリケーションデプロイメント記述子でリソースを識別し、ロールを割り当てることにより、宣言的に保護されます。
識別子とパスワードを使用した基本認証から証明書を使用した高度な認証まで、いくつかのレベルの認証を利用できます。
役割ベースの認証
サーブレット仕様の認証メカニズムは、*ロールベースのセキュリティ*と呼ばれる技術を使用しています。 アイデアは、ユーザーレベルでリソースを制限するのではなく、ロールを作成し、ロールごとにリソースを制限することです。
confのTomcatのホームディレクトリにある tomcat-users.xml ファイルで異なるロールを定義できます。 このファイルの例を以下に示します-
<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
<role rolename = "tomcat"/>
<role rolename = "role1"/>
<role rolename = "manager"/>
<role rolename = "admin"/>
<user username = "tomcat" password = "tomcat" roles = "tomcat"/>
<user username = "role1" password = "tomcat" roles = "role1"/>
<user username = "both" password = "tomcat" roles = "tomcat,role1"/>
<user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>
このファイルは、 username、password 、および role 間の単純なマッピングを定義します。 特定のユーザーが複数のロールを持つ場合があることに注意してください。たとえば、 username = "both" は、「tomcat」ロールと「role1」ロールにあります。
さまざまなロールを特定して定義したら、WEB-INFディレクトリにある web.xml ファイルの <security-constraint> 要素を使用して、さまざまなWebアプリケーションリソースにロールベースのセキュリティ制限を設定できます。
以下はweb.xmlのサンプルエントリです-
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
...
</web-app>
上記のエントリは意味します-
*/secured/* に一致するURLへのHTTP GETまたはPOST要求は、セキュリティ制限の対象となります。
* マネージャーの役割を持つ人には、保護されたリソースへのアクセスが許可されます。
* *login-config* 要素は、認証の *BASIC* 形式を記述するために使用されます。
*/security* ディレクトリを含むURLを参照しようとすると、次のダイアログボックスが表示され、ユーザー名とパスワードを求められます。 ユーザー *"admin"* とパスワード *"secret"* を指定した場合、 */secured/* *に一致するURLにアクセスできます。これには、これにアクセスできる管理者ロールを持つユーザーadminが定義されているためですリソース。
フォームベース認証
FORM認証方法を使用する場合、ユーザーにユーザー名とパスワードの入力を求めるログインフォームを提供する必要があります。 以下は login.jsp の簡単なコードです。 これは、同じ目的のためにフォームを作成するのに役立ちます-
<html>
<body bgcolor = "#ffffff">
<form method = "POST" action ="j_security_check">
<table border = "0">
<tr>
<td>Login</td>
<td><input type = "text" name="j_username"></td>
</tr>
<tr>
<td>Password</td>
<td><input type = "password" name="j_password"></td>
</tr>
</table>
<input type = "submit" value = "Login!">
</form>
</body>
</html>
ここでは、ログインフォームに j_username および j_password という名前のフォーム要素が含まれていることを確認する必要があります。 <form> タグ内のアクションは j_security_check でなければなりません。 POST をフォームメソッドとして使用する必要があります。 同時に、 <login-config> タグを変更してauth-methodをFORMとして指定する必要があります-
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Let only managers use this app</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
...
</web-app>
*URL/secured/* *でリソースにアクセスしようとすると、ユーザーIDとパスワードを要求する上記のフォームが表示されます。 コンテナは「 *j_security_check* 」アクションを検出すると、内部メカニズムを使用して呼び出し元を認証します。
ログインが成功し、呼び出し元が保護されたリソースへのアクセスを許可されている場合、コンテナはセッションIDを使用して、その時点から呼び出し元のログインセッションを識別します。 コンテナは、セッションIDを含むCookieを使用してログインセッションを維持します。 サーバーはCookieをクライアントに送り返し、呼び出し元が後続の要求でこのCookieを提示する限り、コンテナーは呼び出し元が誰であるかを知っています。
ログインに失敗した場合、サーバーはform-error-page設定で識別されるページを送り返します
ここで、 j_security_check は、フォームベースのログインを使用するアプリケーションがログインフォームに指定する必要があるアクションです。 同じフォームで、 j_username というテキスト入力コントロールと j_password という*パスワード入力コントロール*も必要です。 これを見ると、フォームに含まれている情報がサーバーに送信され、名前とパスワードがチェックされます。 これを行う方法はサーバー固有です。
Standard Realm Implementationsをチェックして、 j_security_check がTomcatコンテナに対してどのように機能するかを理解してください。
サーブレット/JSPのプログラムセキュリティ
*HttpServletRequest* オブジェクトは、実行時にセキュリティ情報をマイニングするために使用できる次のメソッドを提供します-
S.No. | Method & Description |
---|---|
1 |
String getAuthType()
|
2 |
boolean isUserInRole(java.lang.String role)
|
3 |
String getProtocol()
|
4 |
boolean isSecure()
|
5 |
Principle getUserPrinciple()
|
たとえば、マネージャーのページにリンクするJavaServer Pageの場合、次のコードがあります-
<% if (request.isUserInRole("manager")) { %>
<a href = "managers/mgrreport.jsp">Manager Report</a>
<a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>
JSPまたはサーブレットでユーザーのロールを確認することにより、Webページをカスタマイズして、ユーザーがアクセスできるアイテムのみを表示できます。 認証フォームに入力されたユーザー名が必要な場合は、リクエストオブジェクトで getRemoteUser メソッドを呼び出すことができます。