gi_dor

로그인 SpringSecurity, MySQL , MyBatis 본문

Back_End/SpringBoot

로그인 SpringSecurity, MySQL , MyBatis

기돌 2024. 4. 15. 12:22
728x90

 

지금까지는 로그인 버튼을 클릭하게되면 해당하는 로그인 페이지의 URL로
@PostMapping을 통해
POST 요청이 전송 되었습니다 
이후 서버에서는 해당 URL로 온 요청을 처리해 로그인을 수행했었다 


이제는 로그인 페이지에서 로그인을 할때 url호출없이
service를 이용할수 있는 로직을 spring security에서 제공해준다


이를 가능케 하는 것은 Spring Security의 UsernamePasswordAuthenticationFilter 때문이다 

특정한 URL로 요청이 들어오면 사용자의 인증정보를 검사하고 인증에 성공하면 사용자를 인증해 세션에 저장한다
이를 통해 URL호출 없이 로그인 처리를 할수 있다

SpringSecurity를 통해 구현된 로그인페이지에서 사용자가 로그인 버튼을 누르면 페이지가 
새로고침 되거나 URL이 변경되지 않아도 내부적으로 제공하는 서비스를 통해 로그인 처리되고 사용자가 인증된다

 

XML

<resultMap id="UserResultMap" type="com.example.bookhub.user.vo.User">
        <id column="user_no" property="no" />
        <result column="user_id" property="id" />
        <result column="user_password" property="password" />
        <result column="user_name" property="name" />
        <result column="user_email" property="email" />
        <result column="user_created_date" property="createdDate" />
        <result column="user_updated_date" property="updatedDate" />
        <result column="user_tel" property="tel" />
        <result column="user_zip_code" property="zipCode" />
        <result column="user_address" property="address" />
        <result column="user_address_detail" property="addressDetail" />
        <result column="user_del_yn" property="delYn" />
    </resultMap>
    
	<select id="selectUserById" parameterType="string" resultMap="UserResultMap">
        SELECT user_no ,
               user_id ,
               user_password ,
               user_name ,
               user_email ,
               user_tel ,
               user_zip_code ,
               user_address,
               user_address_detail ,
               user_created_date ,
               user_updated_date
        FROM USER
        WHERE user_id = #{id}
    </select>

 

SERVICE

@Service
@RequiredArgsConstructor
public class UserService implements UserDetailsService {

    private final UserMapper userMapper;
    private final PasswordEncoder passwordEncoder;
	/**
     * 주어진 사용자 아이디를 기준으로 사용자의 데이터를 가져와 UserDetails 객체로 반환합니다.
     * @param id 사용자 아이디
     * @return UserDetails 객체
     * @throws UsernameNotFoundException 주어진 아이디에 해당하는 사용자를 찾을 수 없는 경우 발생합니다.
     */
    @Override
    public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException {

        // 사용자 아이디를 기준으로 데이터베이스에서 사용자 정보를 가져옵니다. 이 정보는 user 객체에 저장
        User user = userMapper.selectUserById(id);

        // 데이터베이스에서 가져온 사용자 정보가 없다면(null이면) 예외를 발생시킵니다.
        if(user == null) {
            throw new UsernameNotFoundException("Id 찾을수 없습니다 : " +id);
        }

        // UserDetailsImpl 클래스의 객체를 생성합니다. 이 객체는 사용자의 인증 및 권한 정보를 제공하기위해 사용한다
        UserDetailsImpl userDetails = new UserDetailsImpl();

        // 객체에서 가져온 사용자 아이디와 비밀번호를 userDetails 객체에 설정
        userDetails.setId(user.getId());
        userDetails.setPassword(user.getPassword());
        userDetails.setAuthorities(List.of(new SimpleGrantedAuthority("ROLE_USER")));

        return userDetails;
    }
}
 UserService 클래스가 UserDetailsService 인터페이스를 구현하고 있으므로 Spring Security는 UserService  를 통해
사용자의 인증 정보를 가져온다
UserService의 loadUserByUsername 메서드가 사용자 인증을 처리하고, 이를 통해 로그인이 이루어진다

 

 

HTML

<body class="container">
<div class="row text-center">
    <div class="col-2"></div>
        <div class="col-8">
            <div class="form-signin">
                <form action="/user/login" method="post">
                    <img class="mb-4" src="/image/login/logo.png" alt="" width="auto" height="250">
                    <h1 class="h3 mb-3 fw-normal">BookHub Login</h1>

                    <div class="form-floating">
                        <input type="text" class="form-control" id="id" name="id" placeholder="아이디 입력...">
                        <label for="id">아이디</label>
                    </div>
                    <div class="form-floating">
                        <input type="password" class="form-control" id="pwd" name="password" placeholder="Password">
                        <label for="pwd">비밀번호</label>
                    </div>

                    <div class="checkbox mb-3">
                        <label>
                            <input type="checkbox" value="remember-me"> 아이디 저장
                        </label>
                    </div>
                    <button class="w-100 btn btn-lg btn-dark" type="submit" style="margin-bottom: 8px;">로그인</button>
                    <a href="/user/register" class="w-100 btn btn-lg btn-secondary">회원가입</a> <!-- 회원가입 버튼 -->

                    <br>
                    <br>
                    <a href="/passwordReset" class="text-center" style="display: block;">비밀번호를 잊으셨나요?</a>

                    <div class="text-center mt-3">
                        <a class="naver" href="" style="margin: 0 10px;"><img th:src="@{/image/login/naverLogin.png}" style="width: 40px; height: 40px"></a>
                        <a class="kakao" href="" style="margin: 0 10px;"><img th:src="@{/image/login/kakaoLogin.png}" style="width: 40px; height: 40px"></a>
                        <a class="google" href="" style="margin: 0 10px;"><img th:src="@{/image/login/googleLogin.png}" style="width: 40px; height: 40px"></a>
                    </div>

                </form>
                <p class="mt-5 mb-3 text-muted">&copy; 2024–2024</p>
            </div>
        </div>
    <div class="col-2"></div>
</div>

</body>

 

아이디 입력에 name = "username" 이 입력되야 한다

익숙하지도 않고 id가 편해서 securityconfig 파일을 수정해서 

name="id"를 사용하겠다

 

SecurityConfig


// 폼기반 로그인을 활성화
// 사용자가 로그인 한다면 /user/login 경로로 이동하게되는데 로그인 성공시 ("/") 로 리다이렉트
http.formLogin(formLogin -> formLogin.loginPage("/user/login").usernameParameter("id").defaultSuccessUrl("/"));

usernameParameter("id")를 설정

loginForm.html
<input type="text" class="form-control" id="id" name="id" placeholder="아이디 입력..."> name = "id"사용

 

 

 

https://velog.io/@wlgns3855/Spring-Security-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0%EB%A1%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

 

[Spring Security] 스프링 시큐리티로 로그인 기능 구현하기

안녕하세요 오늘은 스프링 시큐리티를 사용하여 로그인 기능을 구현해 보도록 하겠습니다Spring Security는 Spring Boot의 하위 프레임 워크이며 Java 어플리케이션에 인증과 권한 부여를 제공하는데

velog.io

 

728x90