ユーザー認証とセッション
wisdom_config.xmlの設定
セッションの使用可否はサーブレット単位に行いないます。設定にはwisdom_config.xmlの設定が必要です。
例) wisdom_config.xmlのサンプル
<wisdom_config>
<servletRuntimeConfig className='wisdom.core.runtime.RunTimeServlet'
enablesSession="true">
<authenticate required="true" authType="form"
authClass="sitool.web.AuthenticateImpl"/>
・・・・
</wisdom_config>
要素<servletRuntimeConfig>の属性「enablesSession」
この値がtrueになっていると、セッションが使用可能になります。
要素<authenticate>の属性「required」、「authType」、「authClass」
requiredの値がtrueになっていると、認証が必要になります。authTypeの値には"form"、あるいは"basic"の値が設定でき、basicの場合はHTTP
BASIC認証が使用されます。authClassの値には後述のwisdom.core.application.IAuthenticateインタフェースの実装クラスの名前を指定します。
※enablesSession="true"で、authenticate required="false"の場合はユーザーは匿名としてセッション情報が作成されます。(この部分はまだ実装されていません。)
wisdom.core.application.IAuthenticateインターフェースの実装
widsom上で認証ロジックを行うクラスはwisdom.core.application.IAuthenticateインタフェースを実装する必要があります。実行時にはDBへ接続するためのIRequestHandler、入力されたユーザーID、パスワードが引数で渡されるので任意の認証ロジックを実装し、認証されたユーザーに対してwisdom.core.session.UserSessionFactoryクラスを使用してセッション情報を作成してください。認証に失敗した場合、wisdom.core.runtime.AuthenticateExceptionを送出してください。(この例外をキャッチし、ログイン画面へ遷移するようにwisdomを設定します。)
例)IAuthenticateを実装したtutorial.AutenticateImplクラス
package tutorial;
import java.sql.*;
import javax.servlet.http.*;
import wisdom.core.CoreMessageGenerator;
import wisdom.core.Message;
import wisdom.core.application.IAuthenticate;
import wisdom.core.application.IRequestHandler;
import wisdom.core.application.IUserSession;
import wisdom.core.runtime.AuthenticateException;
import wisdom.core.session.UserSessionFactory;
public class AuthenticateImpl implements IAuthenticate {
public static final String sql = "SELECT PASSWORD,USERNAME FROM user
WHERE USERID = ? FETCH FIRST 1 ROW ONLY";
/**
* ユーザー認証を行います。
* @param user ユーザーID
* @param password パスワード
* @exception 実行に送出される例外。
*/
public void authenticate(IRequestHandler rh, String user, String
password) throws Exception {
if (user != null && user.length() > 10) { //
ユーザIDが11桁以上入力
throw new AuthenticateException(CoreMessageGenerator.getInstance().getMessage("WAE0010"));
}
String code = "";
boolean isValidUser = false;
PreparedStatement ps = rh.getConnection(this).prepareStatement(sql);
ps.setString(1, user);
ResultSet rs = ps.executeQuery();
String password_ = null;
String userName = null;
String deptId = null;
if (rs.next()) {
password_ = rs.getString(1).trim();
userName = rs.getString(2).trim();
if (password.equals(password_)) { //
パスワードが一致
IUserSession us = UserSessionFactory.create(rh,
user );
isValidUser = true; //
認証OK
} else code = "WAE0020"; //
パスワードが不一致
} else code = "WAE0010"; //
ユーザ見つからない
rs.close();
ps.close();
if (!isValidUser) throw new AuthenticateException(CoreMessageGenerator.getInstance().getMessage(code));
}
}
wisdom.core.application.IRequestHandlerインターフェースの使用
セッションが使用可能設定され、認証が済んでいる場合、セッション情報へは、wisdom.core.application.IRequestHandlerのメソッドを使用してアクセスを行うことができます。
※詳細はjavadocを参照してください。
wisdom.core.application.IUserSessionインターフェースの使用
wisdom_config.xmlの設定
以下のように、
wisdom.core.tuntime.AuthenticateException、wisdom.core.session.SessionTimeOutedExceptionが発生した場合、ログイン画面へ遷移するよう設定します。
<wisdom_config>
<servletRuntimeConfig className='wisdom.core.runtime.RunTimeServlet'
enablesSession="true">
<authenticate required="true" authType="form"
authClass="sitool.web.AuthenticateImpl"/>
<allowedMethods post="true" get="true"/>
<commandFileName name="runtime-command.xml"/>
<exception className='ProhibitMethodExceoption' page='error.jsp'/>
<exception className='wisdom.core.runtime.ReqidNotFoundException'
page='/error.jsp'/>
<exception className='wisdom.core.runtime.AuthenticateException'
page='/login.jsp'/>
<exception className='wisdom.core.session.SessionTimeOutedException'
page='/login.jsp'/>
・・・・・