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>
ページのトップへ戻る