TomcatのSSOで実現

3281 ワード

ターゲット:ユーザーLoginは一回後、同じServer上の異なるWebappにアクセスできます。具体的にはTomcatを採用したSingle Sign-Onを実現します。主に次のステップに分けられます。
Tomcat conf/server.xmlオープンSSOサポートを修正します。<Host> Value
<Valve className="org.apache.catalina.authenticator.SingleSignOn"
debug="0" requireReauthentication="false"/>
</Host>
container認証realm:user、role、server.xmlの設定。
tomcatの認証機構には2つの要素があります。userとrole。
ユーザーを区別する唯一の識別です。
roleはいくつかの抽象的な権限レベルです。例えば、「admin」、「manager」、「member」、「gusest」などは自分で定義できます。一つのuserは複数のroleを持つことができます。
「でも、tomcatはどうやって私のuser/role情報を入手しますか?私のこれらのデータは全部データベースにありますか?」tomcatのserver.xmlで「Realm」でこれらの情報を読み取ってもいいです。tomcatは3、4種類の既製のRealmを提供しました。その中にはファイルから読むものがあります。JDBCから読むものもあります。DataSourceから読むものもあります。LDAPを読むものもあります。具体的なRealmの書き方と提供された複数のRealmの構成方法は、tomcat自身のドキュメントを参照しても良いです。ここでは詳しく説明しません。(tomcatの持っているwebapp:tomcat-docs.warを展開して、中のconfig/realmを見てください。)これらの既成の配置さえ満足できないなら、Realmの実現類を自分で書いて具体的な要求を満たすことも考えられます。以下、JDBCのRealmの配置例を挙げてみます。<Realm  className="org.apache.catalina.realm.JDBCRealm"  debug="99"
driverName="your.jdbc.driver.here"
connectionURL="your.jdbc.url.here"
connectionName="test"
connectionPassword="test"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name" />
webappはSSOを使用します。
tomcatというwebappはcontainerの認証を受けるべきだと教えてください。
具体的な方法:web.xmlに以下のような配置を加える:<security-constraint>
<web-resource-collection>
<web-resource-name>http://www.bt285.cn  BT </web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- role name role , role, :http://www.5a520.cn http://www.feng123.com  -->
<role-name>intrauser</role-name>
</auth-constraint>
</security-constraint>
認証方法を選択
web.xmlには、以下のような構成を加えます。<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Intra Web Application</realm-name>
</login-config>
<security-role>
<description>The role that is required to access intrasites</description>
<role-name>intrauser</role-name>
</security-role>
ここには2つのポイントがあります。
auth-method
例を簡単にするために一番基本的なBASICを使いました。BASIC方式を使うと、保護された認証を受けたリソースにアクセスすると、ブラウザが小さなウィンドウを開き、ユーザー名とパスワードを入力させます。他にもいくつかの認証方式があります。例えば、FORM、DIGEST、CLIENT-CSERT。この中でFORMは自分でロゴ画面を書くことができるので、当然htmlのフォームの内容には一部規定があります。DIGESTは暗号化された伝送です。CLIENT-CSERTは調べられません。興味があれば調べてみてください。
realm-name
このrealm-nameはこのwebappの認証realm名で、いくつかが同じSSOの下にあるwebappに注意して、彼らのrealm-nameは同じ値に設定します。同じにしないとwebappを変えて再認証します。SSOの効果がありません。
現在のUser情報はどうやって取得しますか?
元々はロゴの後、いくつかのloginユーザー情報をsessionに入れることに慣れていましたが、今は認証をcontainerに任せました。私達のwebappはどうやってloginユーザ情報を手に入れますか?確かに、今私達のwebappでできるのは、requestの中からloginユーザーのuseridをもらうしかないです。
String userid=request.gerRemoteUser()
以上は1つのTomcat Continerの上のSSOで実現します。
異なるContiner上のwebappがSSOをする場合、一番前のウェブセーバーはwebserverで、webserverでSSOの認証任務を引き受けます。後ろの内部は複数のcontainerをかけることができます。具体的に使う時に調べてください。