묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
간단한 인텔리제이 질문!!
안녕하세요 강사님!수업 잘 듣고있습니다 다름이 아니라 .. 정말 간단한 질문인데 메소드 체인으로 이을때 강사님은 빠르게 하시는것같아서 뭐누르시는건지 궁금해서 여쭤봅니다여기 보면 커서가 userId의 마지막에 있잖아요그럴때 이제 저기서 뒤에 .passwordParameter("password") 메소드 체인 이으실때 무슨 키를 누르셨나요? 저는 end키로 ("userId")괄호 끝으로 옮기고 엔터 누른뒤에 했거든여..
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
OncePerRequestFilter 질문
OncePerRequestFilter는 요청당 한 번만 필터가 동작하도록 보장된? 필터라고 말씀해주셨는게 하나의 요청에 하나의 필터가 여러 번 동작하는 경우도 있나요..?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
restSecurityFilterChian에서 addFilterBefore와 authenticationManger 질문
httpSecurity.formLogin()을 설정해주지 않으면, securityFilterChain에 UsernamePasswordAuthenticationFilter가 없지 않나요? restAuthenticationFilter를 UsernamePasswordAuthenticationFilter 앞에 추가할 수 있나요? restAuthenticationFilter에서 authenticationManager를 사용할 수 있도록 설정해주었는데, httpSecurity에 또 세팅해줘야 하는 이유가 있는걸까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
설정 클래스 생성
HttpSecurity 빈이 설정 클래스를 생성한다는 게 SecurityConfigurer 타입 객체들을 생성한다는 건가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
강의자료에서 수정되어야 될 부분이 있네요.
강의자료 DelegatingPasswordEncoder 빈 정의에서알고리즘 지정생성에서@Bean public PasswordEncoder passwordEncoder() { String encodingId = "pbkdf2"; Map encoders = new HashMap<>(); encoders.put(encodingId, Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8()); DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders); return delegatingPasswordEncoder;} 에서 String encodingId = "pbkdf2"; 가 String encodingId = "pbkdf2@SpringSecurity_v5_8""; 로 수정되어야 되거나 아님 encoder 할때 버전을 5_5로 바꾸어야 하네요.한참 헤메이다 저처럼 헤메이지 말라구 올려봅니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
실전프로젝트 소스코드 확인부탁드립니다.
현재 실전프로젝트 강의 듣고 있는데요 로그인페이지를 확인하려고 하는데 소스를 확인할수 없네요.https://github.com/onjsdnjs/spring-security-master/tree/3404뜨는데 강의자료가 유실된건가요? 확인부탁드립니다.
-
미해결스프링부트 시큐리티 & JWT 강의
오류 문의 _ org.springframework.orm.jpa.JpaSystemException: could not deserialize
우선 도움 많이 받고 있습니다 1) 다름이 아니라 3강-시큐리티 회원 가입에서 동영상 강의 12분 10초까지는 제가 작성한 코드가 잘 실행 됩니다. 회원 가입한 데이터가 콘솔에 잘 출력 됩니다 2) 그리고 나서 데이터를 DB까지 잘 저장 하기 위해서 레지파토리를 작성 하여 회원 가입을 시도 했는데 아래와 같이 오류가 발생 합니다 3) 제 소견으로 저는 이미 마리아 DB랑 아래와 같이 설정 하여 사용 중에 있었습니다. 이게 문제인거 같기도 합니다 spring.application.name=FirstProject server.servlet.encoding.force-response=true spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mariadb://localhost:3306/FirstProject?createDatabaseIfNotExist=true spring.datasource.username=root spring.datasource.password=1234 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true spring.jpa.show-sql=true spring.jpa.open-in-view=true User(id=0, username=6, password=6, email=6@naver.com, role=null, createDate=null)Hibernate:insertintouser(create_date, email, password, role, username)values(current_timestamp(6), ?, ?, ?, ?)Hibernate:selectu1_0.create_datefromuser u1_0whereu1_0.id=?2024-08-02T21:41:49.880+09:00 ERROR 19076 --- [FirstProject] [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: could not deserialize] with root cause 아래는 코드 내용 입니다 ~~~~~~~ package com.example.FirstProject.config; 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.web.SecurityFilterChain; @Configuration @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록 public class SecurityConfig { // @Bean public BCryptPasswordEncoder encodePwd() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(csrf -> csrf.disable()); http.authorizeHttpRequests(authorize -> authorize .requestMatchers("/user/**").authenticated() .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().permitAll() ); http.formLogin(form -> form .loginPage("/loginForm")); return http.build(); } } package com.example.FirstProject.controller; import com.example.FirstProject.model.User; import com.example.FirstProject.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; // 아래는 http://localhost:8080/ 로 들어 왔을 때의 겟 맵핑 임 // http://localhost:8080/ 로 들어오면 index.mustache 페이지로 전환 됨 @GetMapping({"","/"}) public String index(){ return "/index"; } // href="/joinForm"가 들어오거나 URL 주소가 8080/joinForm로 들어오면 페이지는 return 값인 joinForm으로(mustache) 전환 해라 @GetMapping("/joinForm") public String joinForm(){ return "joinForm"; } @GetMapping("/loginForm") public String loginForm(){ return "loginForm"; } // 아래는 href="/user"가 타고 들어 오면 URL 주소는 8080/user 이 되면서 페이지는 return 값인 user로(mustache) 페이지가 전환 됨 @GetMapping("/user") public @ResponseBody String user(){ return "user"; } @GetMapping("/admin") public @ResponseBody String admin(){ return "admin"; } @PostMapping("/join") public @ResponseBody 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); return "redirect:/loginForm"; } } package com.example.FirstProject.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import java.security.Timestamp; @Entity @Data public class User { @Id // primary key @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String username; private String password; private String email; private String role; //ROLE_USER, ROLE_ADMIN @CreationTimestamp private Timestamp createDate; } package com.example.FirstProject.repository; import com.example.FirstProject.model.User; import org.springframework.data.jpa.repository.JpaRepository; // JpaRepository 를 상속하면 자동 컴포넌트 스캔됨. public interface UserRepository extends JpaRepository<User, Integer> { // Jpa Naming 전략 // SELECT * FROM user WHERE username = 1? // User findByUsername(String username); // SELECT * FROM user WHERE username = 1? AND password = 2? // User findByUsernameAndPassword(String username, String password); // @Query(value = "select * from user", nativeQuery = true) // User find마음대로(); }<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원가입 페이지</title> </head> <body> <h1>회원가입 페이지</h1> <hr/> <form action="/join" method="post"> <input type="text" name="username" placeholder="Username"/> <br/> <input type="password" name="password" placeholder="Password"/> <br/> <input type="email" name="email" placeholder="Email"/> <br/> <button>회원가입</button> </form> </body> </html> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 페이지</title> </head> <body> <h1>로그인 페이지</h1> <hr/> <!-- 시큐리티는 x-www-form-url-encoded 타입만 인식 --> <form action="/loginProc" method="post"> <input type="text" name="username" placeholder="Username"/> <br/> <input type="password" name="password" placeholder="Password"/> <br/> <input type="email" name="email" placeholder="Email"/> <br/> <button>로그인</button> </form> <a href="/joinForm">회원 가입 페이지 이동</a> </body> </html>
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
메소드 기반 커스텀 AuthorizationManager 구현 관련 질문
안녕하세요 강사님좋은 강의 감사드립니다.해당 영상보면서 따라해보고 있는데 시큐리티 버젼이 달라서 그런건지 원인은 잘 알 수 없지만 @PreAuthorize(value="") 이렇게 설정하면 에러가 발생합니다. 제가 작성한 코드는 다음과 같은데 이유를 알 수 있을까요?강의와 다른점은 저는 @PreAuthorize 어노테이션을 컨트롤러에 선언했습니다.확인해주시고 답변 주시면 정말 감사드리겠습니다.@Configuration @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = false) public class CustomMethodAuthorizationManagerConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .anyRequest().authenticated()) .formLogin(Customizer.withDefaults()) .csrf(AbstractHttpConfigurer::disable) ; return http.build(); } } @EnableMethodSecurity(prePostEnabled = false) @Configuration public class MethodSecurityConfig { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public Advisor preAuthorize() { return AuthorizationManagerBeforeMethodInterceptor.preAuthorize(new MyPreAuthorizationManager()); } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public Advisor postAuthorize() { return AuthorizationManagerAfterMethodInterceptor.postAuthorize(new MyPostAuthorizationManager()); } }MyPostAuthorizationManager와 MyPreAuthorizationManager는 강의의 코드와 동일합니다.@RestController @RequestMapping("/method/custom") @RequiredArgsConstructor public class CustomMethodController { @GetMapping("/admin") @PreAuthorize(value = "") public String admin() { return "admin"; } @GetMapping("/user") @PostAuthorize(value = "isAuthenticated()") public MethodAccountDTO user(String name) { return new MethodAccountDTO(name, false); } }
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
MVC06에 회원정보수정, 이미지등록수정 강의 영상이 없습니다
영상을 보면서 진행을 했는데이미지 등록 부분에서 에러가 발생하길래확인해 보니 깃허브에 수정된 코드들은 있지만수정과 관련된 영상들은 누락되었네요 깃허브 코드 복붙해서 혼자 해보긴 했는데업로드가 오래된 강의이긴 하지만 분명 검수 과정이 있었을텐데인식을 못하셨다는게 아쉽네요 다른 부분들은 보면서 많이 도움이 되었습니다
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
주입받는 authenticationManagerBuilder 질문
HttpSecurity에서 가져올 수 있는 AuthenticationManagerBuilder와주입받는 AuthenticationManagerBuilder가 사로 다른건가요?AuthenticationManagerBuilder가 자동 초기화과정에서 빈으로 생성되고 이게 싱글톤 빈이 아닌건가ㅛ..?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
UsernamePasswordAuthenticationFilter 존재 여부
CustoamAuthenticationFilter를 UsernamePasswordAuthenticationFilter앞에 추가하셨는데,formLogin api를 설정하지 않아도 UsernamePasswordAuthenticationFilter가 존재하는 건가요..?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
namespace 칸이 없습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.가장 egov 4.2버전으로 처음부터 다시 하고있는데namespace 항목이 없습니다.어노테이션에러 해결어떻게 해야할까요..현재 pom.xml에 아래 디펜던시 추가해봣는데도 안됩니다
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
postman에서 rest login role 테스트 하는 방법?
rest api 비동기 로그인을 프로젝트를 따라하며 공부하고 있는데요, postman에서 로그인된 회원에 대한 api를 테스트하고 싶은데 로그인 정보?를 어디에 넣어 줘야 테스트가 가능할까요?
-
미해결스프링부트 시큐리티 & JWT 강의
[자바] 시큐리티 Config 참고
@Configuration @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록 public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authorize -> authorize .requestMatchers("/user/**").authenticated() // /user라는 url로 들어오면 인증이 필요하다. .requestMatchers("/manager/**").hasAnyRole("MANAGER", "ADMIN") // manager으로 들어오는 MANAGER 인증 또는 ADMIN인증이 필요하다는 뜻이다. .requestMatchers("/admin/**").hasRole("ADMIN") // //admin으로 들어오면 ADMIN권한이 있는 사람만 들어올 수 있음 .anyRequest().permitAll() // 그리고 나머지 url은 전부 권한을 허용해준다. ); http.formLogin(form -> form .loginPage("/login")); return http.build(); } }현재 버전 업데이트가 되면서 많이 바꿔어서 참고할 분들은 참고 해주시면 될꺼 같습니다!
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
WebSecurity관해여 질문드립니다
강의자료 pdf 19page 설명하실 때 WebSecurity는 HttpSecurity에서 생성한 SecurityFilterChain을 SecurityBuilder에 저장한다고 하셨는데, SecurityBuilder는 인터페이스인데 어떻게 저장하는지 이해가 안됩니다. 원래 변수나 데이터들은 객체에 저장하는게 아닌가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
컨트롤러에서 그냥 Authentication을 파라미터로 받아요면 null인 이유
컨트롤러가 실행되는 시점이면 이미 모든 Filter를 거쳤으니 AnonymousAuthenticationFilter도 거쳤을거라 생각하고, SecurityContext에도 AnonymousAthenticationToken이 있으니,Authentication에 AnonymousAthenticationToken이 있을거라 생각했는데, 왜 null이 있는건가요??그리고 왜 @CurrentSecurityContext로 찾을때만 AnonymousAthenticationToken를 받을수 있는건가요??
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
회원 권한이 있어도 deinied로 가는데 이유가 뭘까요? ㅠㅠ
package io.security.springsecuritymaster.security.config; import io.security.springsecuritymaster.security.filter.RestAuthenticationFilter; import io.security.springsecuritymaster.security.handler.FormAuthenticationSuccessHandler; import io.security.springsecuritymaster.security.handler.FromAuthenticationFailureHandler; import io.security.springsecuritymaster.security.handler.FromAccessDeniedHandler; import io.security.springsecuritymaster.security.handler.RestAuthenticationFailureHandler; import io.security.springsecuritymaster.security.handler.RestAuthenticationSuccessHandler; import io.security.springsecuritymaster.security.provider.RestAuthenticationProvider; import io.security.springsecuritymaster.security.token.RestAuthenticationToken; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 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.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.WebAuthenticationDetails; @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { // private final UserDetailsService userDetailsService; private final AuthenticationProvider authenticationProvider; private final RestAuthenticationProvider restAuthenticationProvider; private final FormAuthenticationSuccessHandler formAuthenticationSuccessHandler; private final FromAuthenticationFailureHandler fromAuthenticationFailureHandler; private final RestAuthenticationSuccessHandler restAuthenticationSuccessHandler; private final RestAuthenticationFailureHandler restAuthenticationFailureHandler; private final AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> authenticationDetailsSource; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/css/**", "/images/**", "/js/**", "/favicon.*", "/*/icon-*").permitAll() // 정적 자원 설정 .requestMatchers("/", "/signup", "/login*").permitAll() .requestMatchers("/user").hasAuthority("ROLE_USER") .requestMatchers("/manager").hasAuthority("ROLE_MANAGER") .requestMatchers("/admin").hasAuthority("ROLE_ADMIN") .anyRequest().authenticated() ) .formLogin(form -> form .loginPage("/login").permitAll() .authenticationDetailsSource(authenticationDetailsSource) .successHandler(formAuthenticationSuccessHandler) .failureHandler(fromAuthenticationFailureHandler) ) // .userDetailsService(userDetailsService) .authenticationProvider(authenticationProvider) .exceptionHandling(exception -> exception.accessDeniedHandler(new FromAccessDeniedHandler("/denied"))) ; return http.build(); } @Bean @Order(1) public SecurityFilterChain restSecurityFilterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.authenticationProvider(restAuthenticationProvider); AuthenticationManager authenticationManager = authenticationManagerBuilder .build(); http .securityMatcher("/api/login") .authorizeHttpRequests(auth -> auth .requestMatchers("/css/**", "/images/**", "/js/**", "/favicon.*", "/*/icon-*").permitAll() // 정적 자원 설정 .anyRequest().permitAll() ) .csrf(AbstractHttpConfigurer::disable) .addFilterBefore(restAuthenticationFilter(http, authenticationManager), UsernamePasswordAuthenticationFilter.class) .authenticationManager(authenticationManager) ; return http.build(); } private RestAuthenticationFilter restAuthenticationFilter(HttpSecurity http, AuthenticationManager authenticationManager) { RestAuthenticationFilter restAuthenticationFilter = new RestAuthenticationFilter(http); restAuthenticationFilter.setAuthenticationManager(authenticationManager); restAuthenticationFilter.setAuthenticationSuccessHandler(restAuthenticationSuccessHandler); restAuthenticationFilter.setAuthenticationFailureHandler(restAuthenticationFailureHandler); return restAuthenticationFilter; } // @Bean // public UserDetailsService userDetailsService() { // UserDetails user = User.withUsername("user").password("{noop}1111").roles("USER").build(); // return new InMemoryUserDetailsManager(user); // } }
-
미해결스프링부트 시큐리티 & JWT 강의
이론강의
안녕하세요OAuth이론강의는 어디에있는지알수잇을까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticatedAuthorizationManager 흐름도 질문
RequestMatcher가 Request와 매칭되는지 확인결과가 Y라면, entry를 호출해 authorizationManager를 통해 인가 체크.결과가 N이라면, 다음 RequestMatcherEntry의 RequestMatcher를 살펴보는 거 아닌가요?흐름도에는 N인데 바로 AccessDeniedException이 터진다고 되어있는데..
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
프로젝트 생성시 Srping MVC Project 없음
구글링해서 설치하려고 해도 안 되네요. 아래 분들 질문 참고해서 설치하려고 해봐도 안 되는데 자세하게 답변 좀 부탁드립니다 ㅠㅠ
주간 인기글
순위 정보를
불러오고 있어요