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 }