• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

[5강] admin, manager로 로그인시 403에러

23.07.29 17:01 작성 조회수 649

0

안녕하세요! 강의 잘 듣고 있습니다.

다름이 아니라 5강을 진행하던 중, DB에서 ROLE_ADMIN, ROLE_MANAGER로 바꾸어 주었는데도 403에러가 떠서 질문드립니다.

<SecurityConfig>

package com.example.SpringSecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록이 됨.
@EnableMethodSecurity(securedEnabled = true)
public class SecurityConfig {

@Bean
public BCryptPasswordEncoder encodePwd(){
return new BCryptPasswordEncoder();
}

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable) // 사이트 위변조 요청 방지
.authorizeHttpRequests((authorizeRequests) -> { // 특정 URL에 대한 권한 설정.
authorizeRequests.requestMatchers("/user/**").authenticated();
authorizeRequests.requestMatchers("/manager/**")
.hasAnyRole("ADMIN", "MANAGER"); // ROLE_은 붙이면 안 된다. hasAnyRole()을 사용할 때 자동으로 ROLE_이 붙기 때문이다.
authorizeRequests.requestMatchers("/admin/**")
.hasRole("ADMIN"); // ROLE_은 붙이면 안 된다. hasRole()을 사용할 때 자동으로 ROLE_이 붙기 때문이다.
authorizeRequests.anyRequest().permitAll();
})

.formLogin((formLogin) -> {
formLogin
.loginPage("/loginForm") // 권한이 필요한 요청은 해당 url로 리다이렉트
.loginProcessingUrl("/login") // login 주소가 호출되면 시큐리티가 낚아채서 대신 로그인을 해준다.
.defaultSuccessUrl("/"); //로그인 성공시 /주소로 이동

})
.build();
}
}

 

<IndexController>

 

package com.example.SpringSecurity.controller;

import com.example.SpringSecurity.model.User;
import com.example.SpringSecurity.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {

@Autowired private UserRepository userRepository;
@Autowired private BCryptPasswordEncoder bCryptPasswordEncoder;

@GetMapping({"/",""})
public String index(){
return "index";
}

@GetMapping("/user")
public @ResponseBody String user(){
return "user";
}

@GetMapping("/admin")
public @ResponseBody String admin(){
return "admin";
}

@GetMapping("/manager")
public @ResponseBody String manager(){
return "manager";
}

@GetMapping("/loginForm")
public String loginForm(){
return "loginForm";
}

@GetMapping("/joinForm")
public String joinForm(){
return "joinForm";
}

@PostMapping("/join")
public String join(User user){
System.out.println(user);
user.setRole("ROLE_USER");
String rawPassword = user.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
user.setPassword(encPassword);
userRepository.save(user); // 패스워드가 암호화가 안되어있으면, 회원가입은 잘되나 Security를 이용해 로그인 할 수 없다.
return "redirect:/loginForm";
}

@GetMapping("/info")
public @ResponseBody String info(){
return "개인정보";
}
}

 

코드는 이러합니다. SecurityConfig는 v6이어서 수정하였습니다. 에러 해결에 도움 부탁드려요,,

항상 좋은 강의 감사합니다!

답변 2

·

답변을 작성해보세요.

0

jacomyou님의 프로필

jacomyou

2023.12.15

해결하셨나요? 저도 똑같은 문제가 생겨서요..

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.31

안녕하세요, 인프런 AI 인턴이에요.

403 에러는 클라이언트가 서버에 접근하는 것을 거부된 상태를 의미합니다. 이 경우에는 접근 권한에 대한 설정에 문제가 있을 수 있습니다.

Spring Security에서 접근 권한을 설정하는 부분을 확인해보셔야 합니다. SecurityConfig 클래스에서 authorizeRequests 메서드를 사용하여 접근 권한을 설정하고 계시군요.

해당 코드만으로는 정확히 어떤 접근 권한이 필요한지 알 수 없지만, 아마도 ROLE_ADMINROLE_MANAGER 권한을 가진 사용자만 접근 가능한 페이지일 것으로 예상됩니다.

따라서, authorizeRequests 메서드 내부에 적절한 매칭 조건과 접근 권한 설정을 해주셔야 합니다. 예를 들어, 아래와 같이 설정해볼 수 있습니다.

.authorizeRequests()
    .antMatchers("/admin/**").hasRole("ADMIN")
    .antMatchers("/manager/**").hasRole("MANAGER")
    .anyRequest().authenticated()

위 코드는 /admin으로 시작하는 URL은 ROLE_ADMIN 권한을 가진 사용자만 접근할 수 있고, /manager로 시작하는 URL은 ROLE_MANAGER 권한을 가진 사용자만 접근할 수 있도록 설정한 예시입니다.

만약 매칭 조건이나 권한 설정이 잘못되었다면, 403 에러가 발생할 수 있으니 해당 부분을 다시 확인해보시고 수정해보세요. 그리고 수정 후에는 서버를 재시작하는 것도 잊지 마세요.

혹시 이 내용으로도 문제가 해결되지 않으면, 좀 더 코드를 자세히 살펴봐야 할 것 같습니다. 추가적인 정보를 알려주시면 더 도움을 드릴 수 있을 것 같아요.