トッカンソフトウェア

Spring Security ログイン画面作成

前々回はSpring Securityが持つ一番簡易な形でログイン認証機能を行い、前回は、 認証データをデータベースより取得するようにしました。

今回はログイン画面を作ってみます。データベースはPostgreSQLを使用します。PostgreSQLはこちらを参照下さい。

前々回前回かから手を入れるファイルのみ記述するので、記述がないファイルは前回を参照してください。


m_userテーブル

前回をそのまま使うため、省略します。

pom.xml

前回をそのまま使うため、省略します。

applicationContext.xml

前回をそのまま使うため、省略します。

WebSecurityConfig.java

ログイン関連のパスを指定しています。
				
package spring.test;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	@Autowired
	private DataSource dataSource;

	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
		auth.jdbcAuthentication().dataSource(dataSource)
			.authoritiesByUsernameQuery("select id as username, 'USER' as authority from m_user " + 
			" where id = ?")
			.usersByUsernameQuery(
				"select id as username, name as password, true as enabled from m_user " + 
				" where id = ?");
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests().antMatchers("/LoginPage")
			.permitAll().anyRequest().authenticated();
		
		http.csrf().disable().formLogin().loginProcessingUrl("/login")
			.loginPage("/LoginPage")
			.failureUrl("/LoginPage?error=failed")
			.defaultSuccessUrl("/menu", true)
			.usernameParameter("user").passwordParameter("pass");

		http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
			.logoutSuccessUrl("/LoginPage?error=logout");
	}
}

			

LoginControler.java

ログイン画面、メニュー画面のJspファイルにアクセスするのため用意します。
				
package spring.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class LoginControler {

	@RequestMapping(value = "/LoginPage", method = RequestMethod.GET)
	public String loginGet() {
		return "loginpage";
	}

	@RequestMapping(value = "/menu", method = RequestMethod.GET)
	public String test() {
		return "menu";
	}

}

			

loginpage.jsp

ログイン画面です。ログインするまでどのURLにアクセスしてもこの画面に飛ばされます。
				
<%@page import="spring.test.controller.LoginControler"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>ログイン</title>
</head>
<body>
	<spring:url value="/login" var="url" htmlEscape="true" />
	<form action="${url}" method="post">
		ID: <input type="text" name="user" /> <input type="text" name="pass" />
		<input type="submit" value="ログイン">
	</form>
	<%
		String err = request.getParameter("error");
		if (err != null) {
			if (err.equals("failed")) {
				out.println("ログインに失敗しました。");
			} else if (err.equals("logout")) {
				out.println("ログアウトしました。");
			}
		}
	%>
</body>
</html>



			

menu.jsp

メニュー画面です。ログアウトのみを用意しています。
				
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>メニュー</title>
</head>
<body>
	メニュー
	<br />
	<br />
	<spring:url value="/logout" var="url" htmlEscape="true" />
	<a href="${url}">ログアウト</a>
</body>
</html>


			



ページのトップへ戻る