001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.resource;
017
018 import java.text.MessageFormat;
019 import java.util.List;
020
021 import org.opengion.hayabusa.common.HybsSystem;
022 import org.opengion.hayabusa.common.HybsSystemException;
023 import org.opengion.hayabusa.common.SystemManager;
024 import org.opengion.fukurou.util.LogWriter;
025 import org.opengion.fukurou.util.Cleanable;
026 import org.opengion.fukurou.util.StringUtil;
027 import org.opengion.fukurou.util.ApplicationInfo;
028 import org.opengion.fukurou.db.DBUtil;
029
030 /**
031 * systemId に対応したユーザー??を作?するファクトリクラスです?
032 *
033 * UserInfoオブジェクト??キャ?ュせずに、要求?度、データベ?スを検索します?
034 * これは、ユーザー登録が?他シス?より行われる可能性を?慮して?為です?
035 * ユーザーオブジェクト?要求?、基本?ログイン時?みで、その後セ?ョンに
036 * キープされます?
037 *
038 * 検索するカラ?は、?、USERID,LANG,NAME,ROLES,DROLES がこの?で含まれており?
039 * 絞込み条件(?パラメータ)として、SYSTEM_ID,USERID がこの?で?される?があります?
040 * (カラ?は関係ありません。並び?意味が重要です?)
041 * また?検索?ORDER BY)は、優先?位?低い?検索してください。使用するのは、??に
042 * 検索された行を使用します?
043 * ユーザーリソースは、RESOURCE_USER_DBID で????タベ?スから取得します?
044 * 未定義の場合?、RESOURCE_DBID から、それも未定義の場合? ?ォルト?接続??
045 * 使用します?
046 *
047 * SYSTEM_ID='**' は、?通リソースで?ROLESも?通に設定する?があります?)?
048 * これは、シス?間で共通に使用されるリソース??を登録しておきます?
049 * SYSTEM_ID は、指定?シス?IDと**を検索対象にします?**は、?シス?共通?
050 * ??シス?IDと**と両方存在する場合?、指定?シス?IDが優先されます?
051 *
052 * ver4 では、デフォルトロールと??方がなくなりましたので、画面のロールに?
053 * (*)を?示?追?、RWMODE を指定する?があります?
054 *
055 * @og.rev 4.0.0.0 (2004/12/31) 新規作?
056 * @og.group リソース管?
057 *
058 * @version 4.0
059 * @author Kazuhiko Hasegawa
060 * @since JDK5.0,
061 */
062 public final class UserInfoFactory {
063
064 private static final String SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
065
066 // ユーザーリソースの接続?を?取得します?
067 private static String dbid = StringUtil.nval(
068 HybsSystem.sys( "RESOURCE_USER_DBID" ) ,
069 HybsSystem.sys( "RESOURCE_DBID" )
070 ) ;
071
072 // ユーザーリソースのキー?読み込みのクエリー
073 private static String query = HybsSystem.sys( "RESOURCE_USER_SQL" );
074 private static String queryRole = HybsSystem.sys( "RESOURCE_USER_ROLE_SQL" );
075
076 // 5.2.0.0 (2010/09/01) LDAP対?
077 private static String srcType = HybsSystem.sys( "RESOURCE_USER_SRC_TYPE" );
078 private static String[] ldapClm = StringUtil.csv2Array( HybsSystem.sys( "RESOURCE_USER_LDAP_CLM" ) );
079 private static String ldapFilter = HybsSystem.sys( "RESOURCE_USER_LDAP_FILTER" );
080 private static String ldapRoleFilter= HybsSystem.sys( "RESOURCE_USER_ROLE_LDAP_FILTER" );
081
082 private static String searchScope = HybsSystem.sys( "LDAP_SEARCH_SCOPE" );
083 private static String initctx = HybsSystem.sys( "LDAP_INITIAL_CONTEXT_FACTORY" );
084 private static String providerURL = HybsSystem.sys( "LDAP_PROVIDER_URL" );
085 private static String entrydn = HybsSystem.sys( "LDAP_ENTRYDN" );
086 private static String password = HybsSystem.sys( "LDAP_PASSWORD" );
087 private static String searchbase = HybsSystem.sys( "LDAP_SEARCH_BASE" );
088
089 /** コネクションにアプリケーション??を追記するかど???*/
090 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
091
092 // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化??
093 static {
094 Cleanable clr = new Cleanable() {
095 public void clear() {
096 UserInfoFactory.clear();
097 }
098 };
099
100 SystemManager.addCleanable( clr );
101 }
102
103 private static final Object lock = new Object();
104
105 /**
106 * ?ォルトコンストラクターをprivateにして?
107 * オブジェクト?生?をさせな??する?
108 *
109 */
110 private UserInfoFactory() {
111 }
112
113 /**
114 * UserInfo オブジェクトを取得します?
115 *
116 * UserInfoオブジェクト??キャ?ュせずに、要求?度、データベ?スを検索します?
117 * これは、ユーザー登録が?他シス?より行われる可能性を?慮して?為です?
118 * ユーザーオブジェクト?要求?、基本?ログイン時?みで、その後セ?ョンに
119 * キープされます?
120 *
121 * @og.rev 3.7.0.4 (2005/03/18) ゲストログイン機?追?
122 * @og.rev 4.0.0.0 (2007/10/31) ロール?でのログイン機?追?
123 * @og.rev 4.3.4.0 (2008/12/01) GE20(ユーザー定数)へ登録するか?フラグへの対?
124 * @og.rev 4.4.0.0 (2009/08/02) ??タロール対?
125 * @og.rev 5.2.0.0 (2010/09/01) LDAP対?
126 * @og.rev 5.3.6.0 (2011/06/01) GE20の読み込みをUserInfo?移?
127 *
128 * @param userID ユーザーID
129 * @param ipAddress ログイン端末のIPアドレス
130 * @param roles ??タロール
131 *
132 * @return UserInfoオブジェク?
133 */
134 public static UserInfo newInstance( final String userID,final String ipAddress,final String roles ) {
135 // 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
136 ApplicationInfo appInfo = null ;
137 if( USE_DB_APPLICATION_INFO ) {
138 appInfo = new ApplicationInfo();
139 // ユーザーID,IPアドレス,ホスト名
140 appInfo.setClientInfo( userID,ipAddress,null );
141 // 画面ID,操?プログラ?D
142 appInfo.setModuleInfo( "UserInfoFactory",null,"newInstance" );
143 }
144
145 // String[] args;
146 // String[][] vals;
147
148 // if( roles == null || roles.length() == 0 ) {
149 // args = new String[] { SYSTEM_ID,userID };
150 // synchronized( lock ) {
151 // vals = DBUtil.dbExecute( query,args,appInfo,dbid );
152 // }
153 // }
154 // // 4.0.0.0 (2007/10/31)
155 // else {
156 // args = new String[] { SYSTEM_ID,userID,roles };
157 // synchronized( lock ) {
158 // vals = DBUtil.dbExecute( queryRole,args,appInfo,dbid );
159 // }
160 // }
161
162 String[][] vals;
163 if( "LDAP".equalsIgnoreCase( srcType ) ) {
164 vals = getValsByLdap( userID, roles );
165 }
166 else {
167 vals = getVals( userID, roles, appInfo );
168 }
169
170 final UserInfo info ;
171 int len = vals.length ; // シス?ID ** を含??
172 if( len >= 1 && vals[0].length >= 5 ) {
173 // シス?IDでソートされる。SYSTEM_ID="**"は??に現れるので、最後を取?
174 info = new UserInfo(
175 userID , // userID
176 vals[len-1][1] , // lang
177 vals[len-1][2] , // jname
178 vals[len-1][3] , // roles
179 vals[len-1][4] , // droles // 4.4.0.0 (2009/08/02)
180 SYSTEM_ID , // systemId
181 ipAddress , // ipAddress
182 appInfo ) ; // ApplicationInfo
183 }
184 else {
185 String errMsg = "UserInfo の??タ(USERID,LANG,NAME,ROLES,DROLES)が取得できません?
186 + " Key [" + userID + "]"
187 + " SQL [" + query + "]" ;
188 LogWriter.log( errMsg );
189 throw new HybsSystemException( errMsg );
190 }
191
192 return info ;
193 }
194
195 /**
196 * UserInfoFactoryをクリアします?
197 *
198 * @og.rev 5.2.0.0 (2010/09/01) LDAP対?
199 *
200 */
201 public static void clear() {
202 synchronized( lock ) {
203 dbid = StringUtil.nval(
204 HybsSystem.sys( "RESOURCE_USER_DBID" ) ,
205 HybsSystem.sys( "RESOURCE_DBID" )
206 ) ;
207 query = HybsSystem.sys( "RESOURCE_USER_SQL" );
208 queryRole = HybsSystem.sys( "RESOURCE_USER_ROLE_SQL" );
209
210 // 5.2.0.0 (2010/09/01) LDAP対?
211 srcType = HybsSystem.sys( "RESOURCE_USER_SRC_TYPE" );
212 ldapClm = StringUtil.csv2Array( HybsSystem.sys( "RESOURCE_USER_LDAP_CLM" ) );
213 ldapFilter = HybsSystem.sys( "RESOURCE_USER_LDAP_FILTER" );
214 ldapRoleFilter = HybsSystem.sys( "RESOURCE_USER_ROLE_LDAP_FILTER" );
215
216 searchScope = HybsSystem.sys( "LDAP_SEARCH_SCOPE" );
217 initctx = HybsSystem.sys( "LDAP_INITIAL_CONTEXT_FACTORY" );
218 providerURL = HybsSystem.sys( "LDAP_PROVIDER_URL" );
219 entrydn = HybsSystem.sys( "LDAP_ENTRYDN" );
220 password = HybsSystem.sys( "LDAP_PASSWORD" );
221 searchbase = HybsSystem.sys( "LDAP_SEARCH_BASE" );
222 }
223 }
224
225 /**
226 * DBからユーザーリソースの??を取得します?
227 *
228 * @og.rev 5.2.0.0 (2010/09/01) 新規作?
229 *
230 * @param userId ユーザーID
231 * @param roles ロール
232 * @param appInfo DB接続情報
233 *
234 * @return ユーザーリソース??
235 */
236 private static String[][] getVals( final String userId, final String roles, final ApplicationInfo appInfo ) {
237 String[] args;
238 String[][] rtn = null;
239
240 if( roles == null || roles.length() == 0 ) {
241 args = new String[] { SYSTEM_ID,userId };
242 synchronized( lock ) {
243 rtn = DBUtil.dbExecute( query,args,appInfo,dbid );
244 }
245 }
246 // 4.0.0.0 (2007/10/31)
247 else {
248 args = new String[] { SYSTEM_ID,userId,roles };
249 synchronized( lock ) {
250 rtn = DBUtil.dbExecute( queryRole,args,appInfo,dbid );
251 }
252 }
253
254 return rtn;
255 }
256
257 /**
258 * LDAPからユーザーリソースの??を取得します?
259 *
260 * @og.rev 5.2.0.0 (2010/09/01) 新規作?
261 *
262 * @param userId ユーザーID
263 * @param roles ロール
264 *
265 * @return ユーザーリソース??
266 */
267 private static String[][] getValsByLdap( final String userId, final String roles ) {
268 LDAPSearch serch = new LDAPSearch();
269 serch.setSearchScope( searchScope ) ;
270 serch.setInitctx( initctx ) ;
271 serch.setProviderURL( providerURL ) ;
272 serch.setSearchbase( searchbase ) ;
273 if( entrydn != null ) { serch.setEntrydn( entrydn ) ; }
274 if( password != null ) { serch.setPassword( password ) ; }
275 serch.setAttributes( ldapClm ) ;
276 serch.init();
277
278 String filter = ( roles == null || roles.length() == 0 ) ? ldapFilter : ldapRoleFilter;
279 String[] args = ( roles == null || roles.length() == 0 ) ? new String[] { SYSTEM_ID,userId } : new String[] { SYSTEM_ID,userId,roles };
280 filter = MessageFormat.format( filter,(Object[])args );
281
282 List<String[]> list = serch.search( filter );
283
284 String[][] rtn = null;
285 if( list.size() > 0 ) {
286 rtn = new String[1][];
287 rtn[0] = list.get( 0 );
288 rtn[0][1] = StringUtil.nval( rtn[0][1], "ja" ); // ???ォルト?は?ja'
289 rtn[0][2] = StringUtil.nval( rtn[0][2], rtn[0][0] ); // 名称の?ォルト?は、ユーザーID
290 rtn[0][3] = StringUtil.nval( rtn[0][3], ldapClm[3] ); // ロールズの初期値は、ロールに設定された??
291 rtn[0][4] = StringUtil.nval( rtn[0][4], "" );
292 }
293
294 return rtn;
295 }
296 }