【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>
是非フォローしてください
最新の情報をお伝えします