ユーザーパスワードから証明書ベースの認証を使用する従来のアプリケーションがあります。私は、Tomcat 7を使用していますし、私のアプリケーションは、ユーザが例えばすべてのレベルの認証でX509を使用したSpring Security
にアクセスしようとしているアプリケーション内のURLに基づいてセキュリティの4種類をサポートする必要がある: 少数のサーブレットはHTTP を使用するいくつかのサーブレットが使用するHTTPS何も認証なし いくつかのサーブレットはPKIを使用した相互認証を使用しますが、ユーザーは事前に知られていないため、証明書チェーン内の有効な証明書を持つユーザーにはアクセス権が与えられます。 アプリケーションのリセットは管理であるため、事前定義されたユーザ証明書CNに基づいてロールベースのアクセスが行われます。
CLIENTAUTHは=私はHTTPS
を必要とするすべてのURLを一覧表示springSecurityFilterChainを持って自分のアプリケーションのweb.xmlを持っている私のTomcatのserver.xmlに「欲しい」と私は443でHTTPSを実行しているコネクタを持っています
springSecurityContext.xmlには、プロパティファイルから事前登録されたユーザーとロールを読み取る、subject-principal-regex = "CN =(。*?)"というuser-service-ref = "userDetailsService"というx509セクションがあります。 。そこから、インターセプトURLパターンをリストします。ここでは、どのパターンにどの役割が必要なのかによって、require-channel = "https"を設定します。
また、私はこれは私が意志上記のURLのいずれかのため、必要な4つの要件の3を取得し
インターセプト-URLとしてそれが唯一のアクセス=「IS_AUTHENTICATED_ANONYMOUSLY」を設定することで、HTTPSを必要としたいURLを追加バネセキュリティを使用して自動的にHTTPからHTTPSにリダイレクトし、ロールに対してユーザーの資格情報を適用するか、またはクライアント証明書をまったくチェックしません。 web.xml springSecurityFilterChainに入れられていないURLパターンは、HTTP接続を受け入れます。
最終的なパターンは、アプリケーションが証明書チェーンのCAに対して検証されるクライアント証明書を要求するものですが、役割を持つ既知のユーザーデータベースに対して検証されるものではありません。彼らは、クライアント証明書にアクセスする必要がある有効な証明書を持っていますが、実際に私のシステムでは知ることはできません。私はこれをどのように達成するかについてはあまりよく分かりません。
ここで私が話していることを示すために私の3つのXMLファイルから抜粋したものがあります。私は、springSecurityにhttpsandcertlinkを追加して、どれを追加しようとしているのかを表示しましたが、動作させることはできません。
のserver.xml
maxThreads="150" SSLEnabled="true" scheme"https" secure="true"
clientAuth="want" sslProtocol"TLS"
keystoreFile="doesntmatter"
truststoreFile="doesntmatter" />
ウェブ。XML
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>MYAPP</realm-name>
</login-config>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>*.go</url-pattern>
<url-pattern>/httpsonlylink</url-pattern>
<url-pattern>/httpsandcertlink</url-pattern>
</filter-mapping>
springSecurityContext.xml
<security:http xmlns="http://www.springframework.org/schema/security" >
<security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="userDetailsService" />
<security:intercept-url pattern="/management**" requires-channel="https" access="ROLE_MGMT" />
一つのアプローチは、追加の "有効な証明書" の役割を作成することにより、役割の要件に不足している要件を背負うことであろう
<security:intercept-url pattern="/httpsandcertlink**" requires-channel="https" --not sure what to change here-- />
</security:http>
<security:authentication-manager xmlns="http://www.springframework.org/schema/security" alias="authenticationManager">
<security:authentication-provider>
<security:user-service id="userDetailsService" properties="\WEB-INF\users.properties" />
</security:authentication-provider>
</security:authentication-manager>
私はこれも考えましたが、私は例を見つけることができませんでした。今のところ私は認証プロバイダにuser-service id = "userDetailsService" properties = "\ WEB-INF \ users.properties"という行が1つ含まれています。私はそのリストに含まれていないユーザーのためにデフォルトの役割を持つ方法を知りませんでした。それを行うためにJavaクラスを書く必要がありますか、それとも.XMLでもできますか? – ffxhokie
カスタムのuserDetailsService実装の例を以下に示します。http://howtodoinjava.com/spring/spring-security/custom-userdetailsservice-example-for-spring-3-security/あなたはおそらくもっとシンプルになるでしょう。データソース設定を必要とし、 'super'を介して親を呼び出すバージョンで' loadUserByUsername() 'をオーバーライドし、結果に"有効な証明書 "ロールを追加して、そのロールだけで新しいユーザオブジェクトを作成するだけです'super'がnullを返すか、そうでなければユーザを見つけることができなかったことを示します。 Springのドキュメントにも同様の例があるはずです。 –
ありがとう、これは私がやったことです。私はカスタムuserDetailsService実装を作成しました。これはどのユーザーにもロールを割り当て、見つけられたかどうかは分かりませんでした。ありがとう! – ffxhokie