スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC Spring Securityを使ってみる

Spring Securityを使ってログイン画面を作成したのでまとめておく。

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.8.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.Mavenのpom.xml




org.springframework.security
spring-security-core
3.2.3.RELEASE


org.springframework.security
spring-security-ldap
3.2.3.RELEASE


org.springframework.security
spring-security-config
3.2.3.RELEASE


org.springframework.security
spring-security-web
3.2.3.RELEASE


org.springframework.security
spring-security-taglibs
3.2.3.RELEASE


前回の記事まで、グループID「org.springframework」のバージョンは「3.2.3.RELEASE」で定義していた。
しかし、「org.springframework.security」の「3.2.3.RELEASE」が依存している「org.springframework」のバージョンが「3.2.8.RELEASE」のため、「org.springframework」のバージョンを「3.2.3.RELEASE」⇒「3.2.8.RELEASE」に上げて統一した。(最初合わせていなかったが、AP実行時例外が発生したりしなかったり、動作が不安定だった。)

2.web.xml(関連個所のみ)



contextConfigLocation

classpath:spring/application-config.xml
/WEB-INF/security.xml






springSecurityFilterChain

org.springframework.web.filter.DelegatingFilterProxy



springSecurityFilterChain
/*


Spring Securityの定義ファイル(security.xml)をWEB-INFフォルダ直下に格納した。

[参考]Filter関連の過去の記事
Spring MVCとFilterを使ってみる
Spring MVCとFilterを使ってみる(その2)

3.Controller


@Controller
@RequestMapping("book")
public class BookController {

private static Logger logger = LoggerFactory.getLogger(BookController.class);

@Autowired
protected BookService bookService;

@RequestMapping(method = RequestMethod.GET)
public String index(BookForm form) {
logger.info("index start");
return "newBook";
}

@RequestMapping(value = "result", method = RequestMethod.GET)
public String result(BookForm form) {
logger.info("result start");
return "result";
}

@RequestMapping(value = "create", method = RequestMethod.POST)
public String create(@Valid BookForm form, BindingResult result, Model model) {
logger.info("create start");
if (result.hasErrors()) {
return "newBook";
}
//TODO bookServiceより返却されたBookオブジェクトをmodelに追加する
return "result";
}
}

今回、URL「/book/result」でマッピングするresultメソッドを検証用に用意した。

4.security.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
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">

<sec:http auto-config="true">
<sec:intercept-url pattern="/book/**" access="ROLE_ADMIN"/>
<sec:form-login login-page="/login.jsp" default-target-url="/book"
authentication-failure-url="/login.jsp?error=true"/>
<sec:logout logout-url="/logout"
logout-success-url="/login.jsp" />
<sec:access-denied-handler error-page="/error.jsp" />
</sec:http>

<sec:authentication-manager>
<sec:authentication-provider>
<sec:user-service>
<sec:user name="testadmin" password="password1" authorities="ROLE_ADMIN"/>
<sec:user name="testuser" password="password2" authorities="ROLE_GUEST"/>
</sec:user-service>
</sec:authentication-provider>
</sec:authentication-manager>
</beans>

Spring Securityタグの属性について説明する。
sec:intercept-urlタグのpattern属性・・・未ログイン状態の場合に、ログイン画面を表示させるURLを設定する。ワイルドカード「*」が使えるが、2つの場合「/book」も対象となる点は注意が必要だ。
 「/book/**」とアスタリスクを2つ付与した場合(サンプル) ⇒ URL「/book」「/book/create」「/book/result」でログイン画面が表示される。
 「/book/*」とアスタリスクを1つ付与した場合         ⇒ URL「/book/create」「/book/result」でログイン画面が表示される。
 「/book」とアスタリスクを使わない場合             ⇒ URL「/book」でログイン画面が表示される。(GETメソッドのURL「/book/result」と指定した場合、ログインしないでアクセスできてしまうため、このパターンはよろしくない。)
sec:intercept-urlタグのaccess属性・・・ログインを許可するロールを設定する。(今回は「ROLE_ADMIN」を許可。複数指定の場合はカンマ区切り)
sec:form-loginタグのlogin-page属性・・・ログイン画面を設定する。(今回login.jspはwebappフォルダ直下に格納)
sec:form-loginタグのdefault-target-url属性・・・ログイン成功後に表示するURLを設定する。
sec:form-loginタグのauthentication-failure-url属性・・・ログイン情報が誤っていた場合のURLを設定する。クエリ文字列「?error=true」でよさそう。
sec:logoutタグのlogout-url属性・・・ログアウトするURLを設定する。
sec:logoutタグのlogout-success-url属性・・・ログアウトが成功した場合に表示するURLを設定する。(今回はログアウト後にログイン画面を表示)
sec:access-denied-handlerタグのerror-page属性・・・ログイン入力情報は正しいが、intercept-urlタグのaccess属性で設定されていない(=認証拒否された)場合に表示するエラー画面を設定する。設定しない場合、実行時例外となる。ログイン情報が誤った場合に設定するform-loginタグのauthentication-failure-url属性とは異なる点に注意する。
sec:userタグ・・・ユーザー名、パスワード、所属するロール名を設定する。(今回検証用のためパスワードはそのままであるが、MD5のハッシュ値を設定することもできる。)また、ロールは予め用意されており、例えば「ROLE_ADMIN」を「ADMIN」と変更した場合、「Unsupported configuration attributes: [ADMIN]」と、実行時例外となる。

5.login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<link href="<c:url value="/css/bootstrap.min.css" />" rel="stylesheet">
<link href="<c:url value="/css/bootstrap-theme.min.css" />" rel="stylesheet">
<script src="<c:url value="/js/bootstrap.min.js" />"></script>
<title>Login</title>
</head>
<body>
<div class="container-fluid">
<h1>Login</h1>
<c:if test="${not empty param.error}">
<font color="red">
Error: ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</font>
</c:if>
<form class="well" method="POST" action="<c:url value="/j_spring_security_check"/>">
<table>
<tr>
<td align="right" class="col-sm-3">UserName</td>
<td class="col-sm-6"><input type="text" name="j_username"/></td>
</tr>
<tr>
<td align="right" class="col-sm-3">Password</td>
<td class="col-sm-6"><input type="password" name="j_password"/></td>
</tr>
<tr>
<td align="right" class="col-sm-3">Remember me</td>
<td class="col-sm-6"><input type="checkbox" name="_spring_security_remember_me"/></td>
</tr>
<tr>
<td align="right" class="col-sm-3"/>
<td colspan="2" class="col-sm-6">
<input type="submit" value="Login" class="btn btn-primary"/>
<input type="reset" value="Reset" class="btn btn-info"/>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>

内容については、「6.ログイン画面」を見てもらえば、対応関係が分かると思う。
なお、CSSにはBootstrapを使って、見栄えをよくしている。

6.ログイン画面

ログイン

Spring Securityタグは種類が豊富であるが、その分覚えることも多い。

■過去のSpring関連記事
Spring関連記事 Index

■Spring Securityに関する追加記事
Spring MVC ログインユーザー権限によって表示を切り替える
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。