【Spring Security】websecurityconfigureradapterが非推奨だからSecurityFilterChain をBean定義をして認証機能(ログイン機能)作るぜ!!

Springでの認証機能と言えばSpring Securityの「WebSecurityConfigurerAdapter」ですよね?

ただいつの間にか非推奨になってたんですよね( ゚Д゚)

なので代わりになるSecurityFilterChain をBean定義して単純な認証機能を作ってみます

以下を実装して動かしてみてください!

では見てみましょう


【SecurityFilterChain.java】

import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
@Configuration
public class SecurityConfig {

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

		//ログイン処理の実装
		http.formLogin(login -> login //フォーム認証の設定
		    .loginProcessingUrl("/login") //ログイン処理のパス
			.loginPage("/login") //ログインページの指定
			.defaultSuccessUrl("/home") //ログイン成功後の遷移先(任意で「/home」とする)
			.failureUrl("/login?error") //ログイン失敗時の遷移先(任意で「/login?error」とする)
			.permitAll()
		).logout(logout -> logout //ログアウトの設定記述開始
			.logoutSuccessUrl("/login") //ログアウト成功後のリダイレクト先URL
		).authorizeHttpRequests(authz -> authz //URLごとの認可設定
			.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
			.permitAll() //css,jsなどへのアクセス許可
		    .anyRequest().authenticated() //ログインページ以外のURLへはログイン後のみアクセス可能
		);

		return http.build();
	}

	@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

【LoginUserDetailsService.java】

import java.util.Collection;
import java.util.Collections;
import java.util.Optional;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.example.demo.dto.LoginUserDto;
import com.example.demo.dto.UserDetailsConstruct;
import com.example.demo.repository.user.LoginUserDetailsRepository;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class LoginUserDetailsService implements UserDetailsService {

	private final LoginUserDetailsRepository loginUserDetailsRepository;

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		Optional<LoginUserDto> loginUserDto = loginUserDetailsRepository.findByUser(username);
		return loginUserDto
				.map(
						user -> new UserDetailsConstruct(
								user.getLoginName(),
								user.getPassword(),
								getAuthorities()))
				.orElseThrow(
						() -> new UsernameNotFoundException("該当のユーザ名は存在しません (userId = '" + username + "')"));
	}

	private Collection<? extends GrantedAuthority> getAuthorities() {
		//ロールは使用しないため空リストを返却する
		return Collections.emptyList(); // 必要であればロール設定可能
	}
}

【LoginUserDetailsRepository.java】

import java.util.Optional;

import org.springframework.stereotype.Repository;

import com.example.demo.dto.LoginUserDto;
import com.example.demo.mapper.UserMapper;

import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class LoginUserDetailsRepository {

	private final UserMapper userMapper;

	//ログインユーザ名で検索
	public Optional<LoginUserDto> findByUser(String username){
		return userMapper.findByUser(username);
	}
}

【UserMapper.java】

import java.util.Optional;

import org.apache.ibatis.annotations.Mapper;

import com.example.demo.dto.LoginUserDto;
import com.example.demo.entity.UserEntity;

@Mapper
public interface UserMapper {
	Optional<LoginUserDto> findByUser(String username);
}

【UserMapper.xml】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">

  <select id="findByUser" resultType="com.example.demo.dto.LoginUserDto">
	select user_name, password
	from t_user
	where user_name = #{userName};
  </select>

</mapper>

【LoginUserDto.java】

import lombok.Data;

@Data
public class LoginUserDto {

	private String loginName;
	private String password;
}

【login.html】

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>ログイン</title>
<meta charset="utf-8" />
</head>
<body>
	<form th:action="@{/login}" method="post" >
		<label>ユーザー名 :</label> <input type="text" name="username" /><br>
		<label>パスワード :</label> <input type="password" name="password" /><br>
		<input type="submit" value="ログイン" /><br>
		<p th:if="${param.error}" class="text-danger">
		 ユーザ名もしくはパスワードが違います
		</p>
	</form>
</body>
</html>

以下の設定があることを確認ください!


【pom.xml】

		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.5.11</version>
		</dependency>		
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>3.0.0</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
		    <groupId>org.thymeleaf.extras</groupId>
		    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
		</dependency>



是非フォローしてください

最新の情報をお伝えします

コメントを残す