본문 바로가기
Spring-Boot

Spring Security 로그인 방식 변경하기

by 승환파크 2023. 7. 6.

일단 스프링 시큐리티를 사용하기 위해서는 스프링부트 프로젝트에 dependencies 를 수정해야 한다.

다섯 번째는 SpringSecurity 를 사용하기 위해서 작성하고 여섯 번째는 thymeleaf 에서 SpringSecurity 를 사용하기 위해서 작성한다.

 

 

우선 스프링 시큐리티에서 유저를 커스텀 해서 사용하려면 아래와같이 유저로 사용할 클래스를 하나 생성해야한다.

 

클래스를 생성했다면 SecurityConfig 를 생성한다.

여기서 중요한 부분은 두 번째 http 옵션들과 세 번째 http 옵션들이다.

 

두 번째 http 옵션

// 사용자의 권한에 따라 들어갈 수 있는 페이지의 종류가 바뀜
http.authorizeHttpRequests((auth) -> {
	// 아래에 적힌 url 주소는 모든 접속자들이 접근할 수 있음
    auth.antMatchers("/", "/n/", "/loginPage/**", "/signUpPage/**").permitAll();
    // 아래에 적힌 url 주소는 "USER" 권한을 가진 접속자들만 사용할 수 있음
    auth.antMatchers("/myPage/**").hasRole("USER");
});

 

세 번째 http 옵션

// 인가 또는 인증에 문제시 로그인 화면을 보여줌
http.formLogin()
		// 사용할 로그인 페이지(본인이 만든 페이지 접근 url 작성)
        .loginPage("/loginPage/")
        // 로그인에 실패할 때 보낼 url
        .failureUrl("/loginPage/")
        // username으로 사용할 변수이름
        .usernameParameter("id")
        // password로 사용할 변수이름
        .passwordParameter("password")
        // 로그인을 진행할 url
        .loginProcessingUrl("/loginPage/login/")
        // 로그인이 성공했을 때 보내질 url
        .defaultSuccessUrl("/loginPage/login/loginSuccess/")
        // 모든 사용자가 접근할 수 있게 설정
        .permitAll();

 

이후 controller 와 service, repository를 작성해준다.

 

controller

@Controller
public class MemberController {

    @Autowired
    SignUpService signUpService;

    @Autowired
    PasswordEncoder passwordEncoder;

    //로그인 페이지 이동
    @GetMapping("/loginPage/")
    public String loginPage(){
        return "member/loginPage";
    }

    // 로그인 기능
    @PostMapping("/loginPage/login/")
    public void login(String id){
        signUpService.loadUserByUsername(id);
    }
    
    // 로그인 완료
    @GetMapping("/loginPage/login/loginSuccess/")
    public String loginSuccess(){
        return "redirect:/";
    }

    // 로그아웃
    // 로그아웃 기능은 SecurityConfig 에서 작성해주었기 때문에 따로 사용을 하지 않음
    @GetMapping("/logout/")
    public void logout(){

    }

    // 회원가입 페이지 이동
    @GetMapping("/signUpPage/")
    public String signUpPage(){
        return "member/signUpPage";
    }

    // 회원가입
    @PostMapping("/signUpPage/signUp")
    @ResponseBody
    public String signUp(Member member){
        String res = "no";
        res = signUpService.signUp(member, passwordEncoder);
        return res;
    }
}

 

service

@Service
@RequiredArgsConstructor
@Builder
public class SignUpService implements UserDetailsService {

    private final MemberRepository memberRepository;
    
	// SpringSecurity 를 사용해서 로그인 진행하기
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
        Member member = memberRepository.findById(username);
        if(member == null) {
            throw new UsernameNotFoundException(username);
        }
        return User.builder()
                .username(member.getId())
                .password(member.getPassword())
                .roles(member.getRollName())
                .build();

    }
	
    // 멤버 회원가입 메소드
    public String signUp(Member member, PasswordEncoder passwordEncoder){
        member.setPassword(passwordEncoder.encode(member.getPassword()));
        member.setRollName("USER");
        Member signUpMember = memberRepository.save(member);
        if(signUpMember == null){
            return "no";
        }else{
            return "yes";
        }
    }
}

 

repository

@Repository
public interface MemberRepository extends JpaRepository<Member, Object> {
    Member findById(String id);
}

 

위의 방식대로 사용하면 SpringSecurity 에서 내가 사용할 객체로 변경해서 로그인을 할 수 있다.