Tomcat で Web アプリを実行しています。サーバーによって信頼された有効な証明書を持つすべてのユーザーに Web アプリへのアクセスを許可したいのですが、証明書からユーザーの DN を読み取りたいと考えています。clientAuth="true" ("want" も機能します) を使用して SSL コネクタを構成しました。web.xml には、クライアント証明書を提示する必要があるログイン制約があります。ユーザー証明書の署名に使用される CA 証明書を使用してトラストストアを構成しました。
クライアントは証明書を提示し、サーバーはそれを受け入れて、アプリへのアクセスを許可します。私の問題は、HttpServletRequest インスタンスで getUserPrincipal() を呼び出すと、null になることです。auth-constraint を web.xml に追加して、ユーザーが特定のロールに所属することを要求し、ユーザーが指定されたロールに所属するように構成されている場合、ユーザー プリンシパルは null ではありません。
HttpServletRequest の API によると、ユーザーが認証されていない場合、ユーザー プリンシパルは null になります。ユーザーは有効で信頼できる証明書を提示したため、認証されたと考えていますが、このコンテキストでの認証には承認が含まれているようです。
ユーザーを特定のロールに割り当てずに、有効な信頼できる証明書からユーザー プリンシパルにアクセスする方法はありますか?
プリンシパルが null になる web.xml スニペットを次に示します。
<security-constraint>
<web-resource-collection>
<web-resource-name>My App</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>My Realm</realm-name>
</login-config>
そして、指定されたロールに対してユーザーが構成されている場合にユーザープリンシパルを取得できるようにする web.xml スニペットを次に示します。
<security-constraint>
<web-resource-collection>
<web-resource-name>My App</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Some Role</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>My Realm</realm-name>
</login-config>
<security-role>
<role-name>Some Role</role-name>
</security-role>