トッカンソフトウェア

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.context.annotation.Bean;
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.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@EnableWebSecurity
public class WebSecurityConfig {

	@Autowired
	private DataSource dataSource;

	/**
	 * テスト用PasswordEncoder 暗号化なし
	 * 
	 * @return PasswordEncoder
	 */
	@Bean
	public PasswordEncoder passwordEncoder() {
		return NoOpPasswordEncoder.getInstance();
	}

	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

		String authoritySql = "select id as username, 'USER' as authority from m_user " + 
			" where id = ?";
		String passwordSql = "select id as username, name as password, true as enabled from m_user " + 
			" where id = ?";
		auth.jdbcAuthentication().dataSource(dataSource).authoritiesByUsernameQuery(authoritySql)
				.usersByUsernameQuery(passwordSql);
	}

	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

		http.authorizeHttpRequests().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");

		return http.build();
	}
}

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>


			



ページのトップへ戻る