Framework/Spring Boot

[SpringSecurity] WebSecurityconfig

잔망루피 2021. 11. 19. 21:33

Example)

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http
                .authorizeRequests()
                    .antMatchers("/", "/user/joinForm").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/user/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception{
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .passwordEncoder(passwordEncoder())
                .usersByUsernameQuery("select username, password, enabled "
                +"from user "
                +"where username = ?")
                .authoritiesByUsernameQuery("select u.username, r.name "
                +"from user_role ur inner join user u on ur.user_id = u.id "
                        +"inner join role r on ur.role_id=r.id "
                +"where u.username=?");

    }

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

 

.antMatchers("/", "/user/joinForm").permitAll()

로그인을 하지 않아도 접근할 수 있는 url을 넣어준다.

/는 홈이고, /user/joinForm은 회원가입 페이지다.

 

 

.usersByUsernameQuery("select username, password, enabled "
                +"from user "
                +"where username = ?")
                .authoritiesByUsernameQuery("select u.username, r.name "
                +"from user_role ur inner join user u on ur.user_id = u.id "
                        +"inner join role r on ur.role_id=r.id "
                +"where u.username=?");

쿼리문에서 컬럼명을 username, password, enabled로 하자.

username를 user_id로 하니까 에러는 안 뜨는데 로그인이 안 되었다.

 

 

    @PostMapping("/user/login")
    public String login(String userId, String password, HttpSession session){
        Optional<User> user=userRepository.findByUserId(userId);
        if(user.isEmpty()){
            System.out.println("Login Failure!");
            return "redirect:/user/loginForm";
        }
        if(!user.get().getPassword().equals(password)){
            System.out.println("Login Failure!");
            return "redirect:/user/loginForm";
        }

        System.out.println("Login Success!");
        session.setAttribute("user", user);

        return "redirect:/";
    }

처음에는 스프링 시큐리티를 안 쓰고 위와 같이 로그인 기능을 구현했다.

로그인, 로그아웃 버튼 중 하나만 보이게 구현하는 과정에서 스프링 시큐리티가 필요했다.

 

 

참고 👉

https://jithub.tistory.com/344

 

[스프링 인 액션] Chapter 4 - 스프링 시큐리티 :: 스프링 시큐리티 구성하기

장황한 XML 기반의 구성을 포함해서 그동안 스프링 시큐리티를 구성하는 방법은 여러가지가 있었다. 다행스럽게도 최근의 여러 스프링 시큐리티 버전에서는 훨씬 더 알기 쉬운 자바 기반의 구성

jithub.tistory.com

 

https://docs.spring.io/spring-security/reference/reactive/integrations/cors.html

 

CORS :: Spring Security

Spring Framework provides first class support for CORS. CORS must be processed before Spring Security because the pre-flight request will not contain any cookies (i.e. the JSESSIONID). If the request does not contain any cookies and Spring Security is firs

docs.spring.io

 

반응형