10月31日

小さな粒度の課題を実施する

今日の2現目はテストなので、作業できるのは70分程度。その短い時間で達成できそうな課題を考えて、その課題を完了させることを目標にすること。

Gitの活用

ソースコードを変更しているときに、変更方法が不適切だと気づいたときは、そのソースコードのファイルを右クリックし、[チーム]-[リセット]を選択するとよい。修正を加える前の状態に戻せる。

Gitの問題?

プッシュして、BacklogのGit上では更新されているのに、プルしても最新のファイルを取得できない問題あり?

10月30日

Spring Securityによるログアウトの方法

Spring Security でログアウトを実装するには、設定ファイル spring-security.xml に以下の設定を追加する。

	<sec:http auto-config="true">
		<intercept-url pattern="/**" access="ROLE_USER" />
		<sec:logout
			logout-url="/logout"
			logout-success-url="/"
			invalidate-session="true"
			delete-cookies="JSESSIONID" />
	</sec:http>

sec:logout タグ内の logout-url で指定した URL にアクセスすると、セッション情報が破棄される。

ログアウトを追加したい画面に対応する JSP に、以下のリンクを追加すればよい。
ログイン中のユーザーがここをクリックすると、セッション情報が破棄され、ログアウトする。

<a href="/logout">Logout</a>

トラブルシューティング

DBに登録でエラーになる

Q.新規ユーザーをDBに登録するところで例外が発生して登録できない。
A.コンソールの内容を確認すると、commit()で例外が発生している。メッセージを確認すると、「unique constraint or index violation」と表示。
プライマリキーを自動で割り当てるように、エンティティにアノテーションを追加すれば解決する。

10月17日

認証なしでアクセス可能なページの設定


JavaScriptやCSS、画像など認証不要でアクセス可能なURLを指定する方法について。

cssや画像を取得できるようにする

mvc-config.xmlに以下の設定を追加する。

	<mvc:resources mapping="/css/**" location="/css/" />

Spring Security でアクセス制限する場合、誰でもアクセス可能なページは、security-config.xml で設定する。
たとえば、アプリケーションコンテキストルートに対応するページは誰でもアクセス可能にするべきなので、以下のように設定する。

    <sec:http pattern="/" security="none"/>

以下は security-config.xml の全体。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:sec="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver" />
		<beans:property name="url" value="jdbc:hsqldb:hsql://localhost/exam" />
		<beans:property name="username" value="sa" />
		<beans:property name="password" value="" />
	</beans:bean>

	<beans:bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />

	<sec:http pattern="/" security="none"/>
	<sec:http pattern="/index.jsp" security="none"/>
	<sec:http auto-config="true">
		<intercept-url pattern="/**" access="ROLE_USER" />
	</sec:http>

	<authentication-manager>
	    <authentication-provider>
                <user-service>
                    <user name="taro" password="abcd" authorities="ROLE_USER" />
                </user-service>
	    </authentication-provider>
	</authentication-manager>

</beans:beans>

Tomcatサーバーにアプリケーションコンテキストを追加できない場合

Tomcatサーバーを右クリックして「追加および除去」を選択し、ダイアログの中に動作させたいアプリケーションコンテキスト名が表示されていない場合は、以下の設定を確認する。

  1. プロジェクトを右クリックし、プロパティを開く。
  2. ダイアログの左で「プロジェクト・ファセット」を選択する。
  3. 「動的Webモジュール」の「バージョン」を「2.5」に変更する。
  4. 「動的Webモジュール」のチェックボックスをチェックする。
  5. ダイアログで「OK」する。

データベースを使った認証

現状では spring-security.xml に書いたユーザー名とパスワードで認証しているが、これをデータベースを使った認証に変更する。

USERSテーブルの準備

HSQLDBのデータベースマネージャを起動し、以下のSQLでテーブルを作成する。

CREATE TABLE users(
 user_id bigint NOT NULL identity,
 user_name varchar(50) NOT NULL,
 password varchar(50) NOT NULL,
 enabled tinyint NOT NULL,
 role varchar(100) NOT NULL
);

テスト用のユーザーをUSERSテーブルに追加する

以下のSQLでユーザーを追加する。

INSERT INTO users ( user_name , password , enabled, role)
   VALUES ( 'taro', 'abcd' , 1, 'ROLE_USER' );

spring-security.xmlの変更

spring-securoty.xml の以下の箇所でユーザー名とパスワードを指定している。

	<authentication-manager>
	    <authentication-provider>
                <user-service>
                    <user name="taro" password="abcd" authorities="ROLE_USER" />
                </user-service>
	    </authentication-provider>
	</authentication-manager>

この部分をデータベースのUSERSテーブルから取得するようにするために、以下のように修正する。

	<authentication-manager>
	    <authentication-provider>
                <jdbc-user-service data-source-ref="dataSource"
	             users-by-username-query="SELECT user_name, password, enabled FROM users WHERE user_name = ?"
	             authorities-by-username-query="SELECT user_name, role FROM users WHERE user_name = ?"
	        />
	    </authentication-provider>
	</authentication-manager>

10月16日

チーム開発の続き

Spring Securityによる認証

サイトにログイン機能を追加するには、Spring Security を使用すると簡単に実装できる。

Spring Security の設定ファイルを読み込ませるために、contextConfigLocation を追加する。

web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-security.xml</param-value>
    </context-param>

すべてのページにアクセスする前にアクセス権限のチェックを実行させるため、web.xml の最後に、フィルターを追加する。

web.xml

	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

src/main/resources/spring フォルダに、spring-security.xml を作成する。
まずはXMLで指定したユーザーでログインできるようにする。
ユーザー名: taro
パスワード: abcd

あとでDBから取得するように変更する。

spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:sec="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver" />
		<beans:property name="url" value="jdbc:hsqldb:hsql://localhost/exam" />
		<beans:property name="username" value="user" />
		<beans:property name="password" value="password" />
	</beans:bean>

	<beans:bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />

	<sec:http pattern="/" security="none"/>
	<sec:http pattern="/index.jsp" security="none"/>
	<sec:http auto-config="true">
		<intercept-url pattern="/**" access="ROLE_USER" />
	</sec:http>

	<authentication-manager>
		<authentication-provider>
            <user-service>
                <user name="taro" password="abcd" authorities="ROLE_USER" />
            </user-service>
		</authentication-provider>
	</authentication-manager>

</beans:beans>

exam-8

10月9日

チーム開発について

1日のスケジュール

9:45~10:00
グループミーティングを行う。各メンバーが、その日に取り組む課題を決める。
課題はBacklogで管理する。
全員が何かの課題の担当者となるようにすること。
ミーティングのあと、取り組む課題をBacklogで確認する。

10:00~12:50
成果発表。発表する際には、KPTを意識する。
KPTとは・・・
Keep、Problem、Tryの頭文字。

KPT参考資料

各グループで取り組む課題要旨

・画面遷移図
 ロバストネス図で作成する。
・各画面の作成
 デザイナーではないので、画面に凝らないこと!
・エンティティの設計
 システム内でエンティティとなるクラスを見つける。
 エンティティの責務をはっきりさせる。
・Dao/DaoImpleの作成
 エンティティがわかれば必要なDao/DaoImplもわかる。
・Controllerの作成
 画面遷移図にあわせてControllerを作成する。
 ひとつのControllerには複数の機能を割り当てない。

UML図やロバストネス図を電子化したい場合は astah community が無料で使用できる。
http://astah.change-vision.com/ja/product/astah-community.html

exeファイルだとインストールには管理者権限が必要なので、ZIPファイルをダウンロードして適当なところに展開する。

ログインに関する部分

ログインは、spring-security を使用する。
以下のページを参考にする。

Spring Security: ユーザ認証情報をDBに保存する
http://kurotofu.sytes.net/kanji/fool/?p=934

パスワードの暗号化は後回しにする。
暗号化したパスワードを保存すると、開発中のオーバーヘッドが増えてしまうから。

Gitのコミット&プッシュ

コミットする前に、すべてのファイルのチェックをはずし、自分で編集したファイルだけにチェックを入れる。
コメントランには、編集した内容を簡潔に記述する。(課題のIDと修正内容:○○バグの修正、入力チェックを追加等)

10月3日

GITを使ってチーム内でソースコードを共有する

BacklogのプロジェクトでGitリポジトリを作成する

こちらを参考に、BacklogにGitリポジトリを作成する。

プロジェクトをローカルリポジトリにコミットする

プロジェクトをBacklogのリモートリポジトリにプッシュする

こちらを参考に、プロジェクトをリモートリポジトリにプッシュする。

リモートリポジトリをローカルにクローンする

代表者以外の人は、代表者がリモートリポジトリにプッシュしたプロジェクトを、ローカルにクローンする。

  1. Eclipseで[ファイル]-[インポート]を選択。
  2. ダイアログで[Git]-[Gitからプロジェクト]を選択して「次へ」をクリック。
  3. [Clone URI]を選択して「次へ」をクリック
  4. URI に、BacklogのプロジェクトのGitタブにあるURLを貼り付ける。
  5. backlog-1

  6. Backlogプロジェクトのユーザー名とパスワードを入力して「次へ」をクリック
  7. masterがチェックされた状態で「次へ」をクリック
  8. git-1

  9. ローカルの保管場所はそのままで「次へ」をクリック
  10. git-2

  11. プロジェクトのインポートもそのままの設定で「完了」をクリック
  12. git-4

  13. Eclipseにプロジェクトが追加された!
  14. git-5

ユーザー認証

ユーザー認証はSpring Securityを使用する。

こちらのサイトを参考に。

その他、「srping security hibernate ユーザー認証」などのキーワードで検索するとよい。