Tag Archives: フレームワーク

[SAStruts][Interceptor]セッションによるログイン認証を可能にする

Webアプリケーションだと、セッション(Session)でログイン情報を保持する方法をよくとる。
今回は、SAStrutsでログイン処理+セッション保持を紹介する。
たぶん、このやり方が一般的かと思う。

■はじめに
今回、Eclipse→Dolteng→SAStruts→S2JDBCで開発するので、その辺を注意。
プロジェクト名が「LoginSample」とする。
ベースURLが「http://localhost:8080/LoginSample/」とする。
ベースパッケージが「biz.mikuriya」とする。

■大まかな手順
いくつかのプログラム開発、設定ファイル編集を行なうと、
ログイン処理+セッション保持が可能になる。
以下の手順で作業を進める。

・ユーザーデータクラスを作成
・アクションフォームクラスを作成
・アクション(ページ構成)を作成
・アクションに合ったJSPを作成
・ログイン処理+セッション保持処理用のクラスを作成
・customizer.diconを編集
・動作確認

■ユーザーデータクラスを作成
メールアドレスだけをセッションに保持しておきたいので、
ユーザーデータクラスは、以下のように作成。

biz.mikuriya.dto.UserDto.java

package biz.mikuriya.dto;

import java.io.Serializable;

import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;

@Component(instance = InstanceType.SESSION)
public class UserDto implements Serializable {
	private static final long serialVersionUID = 1L;

	public String email;
}

■アクションフォームクラスを作成
メールアドレスとパスワードの入力によるログイン処理が行なわれるため、
それ用の入力チェックデータクラスを作成。

biz.mikuriya.form.UserForm.java

package biz.mikuriya.form;

import org.seasar.struts.annotation.EmailType;
import org.seasar.struts.annotation.Maxlength;
import org.seasar.struts.annotation.Minlength;
import org.seasar.struts.annotation.Required;

public class UserForm {
	@Required
	@EmailType
	public String email;

	@Required
	@Minlength(minlength = 6)
	@Maxlength(maxlength = 32)
	public String password;
}

■アクション(ページ構成)を作成
今回は3ページ作成する。
トップページ、ログインページ、マイページの3種類を作成。

biz.mikuriya.action.IndexAction.java(トップページ)

※ログインの必要がないページ

package biz.mikuriya.action;

import javax.annotation.Resource;

import org.seasar.struts.annotation.Execute;

import biz.mikuriya.dto.UserDto;

public class IndexAction {
	@Resource
	public UserDto userDto;

    @Execute(validator = false)
	public String index() {
        return "index.jsp";
	}
}

biz.mikuriya.action.LoginAction.java(ログインページ)

※ログインの必要がないページ

package biz.mikuriya.action;

import javax.annotation.Resource;

import org.seasar.framework.beans.util.Beans;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

import biz.mikuriya.dto.UserDto;
import biz.mikuriya.form.UserForm;

public class LoginAction {
	@Resource
	@ActionForm
	public UserForm userForm;

	@Resource
	protected UserDto userDto;

	@Execute(validator = true, input = "/login/index.jsp")
	public String index() {
		// セッションへの保存処理
		// userDtoに値を入れるだけでSessionに保存される
		Beans.copy(this.userForm, this.userDto).execute();

		return "/mypage/?redirect=true";
	}
}

biz.mikuriya.action.MypageAction.java(マイページ)

※ログインが必要なページ

package biz.mikuriya.action;

import javax.annotation.Resource;

import org.seasar.struts.annotation.Execute;

import biz.mikuriya.dto.UserDto;

public class MypageAction {
	@Resource
	public UserDto userDto;

	@Execute(validator = false)
	public String index() {
		return "index.jsp";
	}
}

■アクションに合ったJSPを作成
前項で作成したActionに一致したJSPファイルを作成。

/WEB-INF/view/index.jsp

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>トップページ</title>
</head>
<body>
	<h1>トップページ</h1>

	メールアドレス<br/>
	ここに表示「<b>${userDto.email}</b>」<br/>

	<br/>

	<a href="<c:url value="/"/>">トップページ</a>|<a href="<c:url value="/login/"/>">ログインページ</a>|<a href="<c:url value="/mypage/"/>">マイページ</a>
</body>
</html>

/WEB-INF/view/login/index.jsp

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>ログインページ</title>
</head>
<body>
	<h1>ログインページ</h1>

	<html:errors/>

	<s:form action="/login/">
		メールアドレス<html:text property="email" /><br/>
		パスワード<html:password property="password" /><br/>
		<br/>
		<html:submit value="ログイン"/>
	</s:form>

	<br/>

	<a href="<c:url value="/"/>">トップページ</a>|<a href="<c:url value="/login/"/>">ログインページ</a>|<a href="<c:url value="/mypage/"/>">マイページ</a>
</body>
</html>

/WEB-INF/view/mypage/index.jsp

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>マイページ</title>
</head>
<body>
	<h1>マイページ</h1>

	<b>これがマイページ</b><br/>

	メールアドレス<br/>
	ここに表示「<b>${userDto.email}</b>」<br/>

	<br/>

	<a href="<c:url value="/"/>">トップページ</a>|<a href="<c:url value="/login/"/>">ログインページ</a>|<a href="<c:url value="/mypage/"/>">マイページ</a>
</body>
</html>

■ログイン処理+セッション保持処理用のクラスを作成
重要ポイントとなるログイン処理クラスを作成。

biz.mikuriya.interceptor.LoginConfirmInterceptor.java

package biz.mikuriya.interceptor;

import javax.annotation.Resource;

import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;
import org.seasar.struts.annotation.Execute;

import biz.mikuriya.dto.UserDto;

public class LoginConfirmInterceptor extends AbstractInterceptor {
	private static final long serialVersionUID = 1L;

	@Resource
	protected UserDto userDto;

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		// ここの条件がtrueであればログイン済みと判断
		// ここの条件がfalseであればログインページへ移動
		return (!isExecuteMethod(invocation) || isLoggedIn()) ? invocation
				.proceed() : "/login/";
	}

	private boolean isExecuteMethod(MethodInvocation invocation) {
		return invocation.getMethod().isAnnotationPresent(Execute.class);
	}

	private boolean isLoggedIn() {
		// Sessionにユーザー情報が登録されているかチェック
		return (userDto != null && userDto.email != null);
	}
}

■customizer.diconを編集
これも重要ポイントとなるログイン処理を有効にするための設定ファイル
これを編集する。
MypageActionだけをセッションチェックしたいので、addClassPatternで登録する

customizer.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="default-customizer.dicon"/>
	<component name="formCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"/>

	<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
		<initMethod name="addAspectCustomizer">
			<arg>"aop.traceInterceptor"</arg>
			<!-- ここ重要(追加必須) -->
			<arg>true</arg>
		</initMethod>

		...(中略)...

		<!-- SESSIONのチェック設定はここから -->
		<initMethod name="addCustomizer">
			<arg>
				<component class="org.seasar.framework.container.customizer.AspectCustomizer">
					<property name="interceptorName">"loginConfirmInterceptor"</property>
					<!-- ここ重要(追加必須) -->
					<property name="useLookupAdapter">true</property>

					<!-- このActionだけセッションチェックを行なう -->
					<initMethod name="addClassPattern">
						<arg>"biz.mikuriya.action"</arg>
						<arg>"MypageAction"</arg>
					</initMethod>
				</component>
			</arg>
		</initMethod>
		<!-- SESSIONのチェック設定はここまで -->
	</component>

	...(省略)...
</components>

「ここ重要」とコメントにした部分は、とても重要。
以下のURLに書かれているように、HotDeploy時とCoolDeploy時では、
動作が違うので、注意すべし。

[S2Container][SAStruts] セッション格納の値について

■動作確認
実際に動作を確認する。

http://localhost:8080/LoginSample/

セッションがない状態でマイページへ接続

http://localhost:8080/LoginSample/mypage/

[PHP]フレームワーク「CakePHP」のインストールと設定

symfonyも良かったが、学ぶ時間が限られているので、

もう少し手軽に開発できるCakePHPに方向転換。

手軽というか構造がRuby on Railsに近いっていった方が適切かも。

■作業する前に(インストール編)

最低でもApacheとPHPはインストールしておく。

CakePHPの前にApacheの設定から。

httpd.confの設定はよく知らないから、詳しくは他で調べてほしい。

まずmod_rewriteを有効にする。

LoadModule rewrite_module modules/mod_rewrite.so

次にhtdocsの設定でAllowOverrideをAllに変更。

<Directory "C:/Apache2.2/htdocs">
...
...
  AllowOverride All
...

編集したらApache再起動

■CakePHPのインストール

http://cakephp.org/」からCakePHPをダウンロードする。

「cake_1.2.0.7692-rc3.zip」を解凍し、フォルダの名前を変えて

${APACHE_HOME}/htdocsに設置

※1.1.X系をダウンロードすると、ディレクトリ構造が多少違うため、オススメしない

ブラウザを開いて、http://localhost/{変更したフォルダ名}に接続。

以上

「書くのが面倒臭せぇ」symfonyの参考サイト紹介

PHPとか結構ナメてるけど、

Javaを個人の金銭で動かせるレンタルサーバがないので

PHPも勉強しなきゃいけないかな、と思った。



そんで今回symfonyっていうフレームワークを勉強することにした。

やっててわかったけど、最近のフレームワークは「Ruby on Rails」に近いのね。

コマンドベースで楽に開発できる。



PHPのインストールもそうだけど、解説文を書くのが面倒になってきたので

最適な参考サイトを紹介する。



■symfony入門(1):symfonyで始めるPHPフレームワーク

http://codezine.jp/article/detail/704?p=1