일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- LeetCode SQL
- kotlin 클래스
- 자바 스트림
- Spring
- python
- SQL 문제풀이
- SQL프로그래머스
- springboot
- js
- 코틀린 클래스
- 오라클
- 스프링
- 자바8
- oracle
- pygame
- 파이게임
- MSA
- javascript
- 프로그래머스
- 스프링시큐리티
- mysql
- 구글로그인
- SQL
- 스프링부트 채팅서버
- Leetcode
- spring boot
- oauth2
- 자바스크립트
- java8
- 스프링부트
Archives
- Today
- Total
웅겹살의 프로그래밍 삼매경
[Spring Boot] spring security 기록용 본문
728x90
스프링부트 + JPA + 스프링시큐리티
프로젝트 진행중
시큐리티 관련내용 기록용으로 글 작성한다
OAUTH2 작업중으로 추가예정
설명 필요한부분 주석달아둠
1. SecurityConfig
package com.leo.blog.config;
import com.leo.blog.config.auth.PrincipalDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
// 빈 등록 ㅣ 스프링 컨테이너에서 객체를 관리할 수 있게 하는 것
@Configuration // 빈동록(IoC관리)
@EnableWebSecurity // 시큐리티 필터 추가 = 스프링 시큐리티가 활성화가 되어있는데 어떤 설정을 해당 파일에서 하겠다.
@EnableGlobalMethodSecurity(prePostEnabled = true) // 특정 주소로 접근을 하면 권한 및 인증을 미리 체크한다.
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PrincipalDetailService principalDetailService;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
// 시큐리티가 대신 로그인해주는데 password를 가로채기 하기에
// 해당 password가 뭘로 해쉬가 되어 회원가입이 되었는지 알아야
// 같은 해쉬로 암호화하여 DB에 있는 해쉬랑 비교 가능
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(principalDetailService).passwordEncoder(bCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable() // csrf 토큰 비활성화
.authorizeRequests()
.antMatchers("/","/auth/**", "/js/**", "/css/**", "/image/**", "/dummy/**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/auth/loginForm")
.loginProcessingUrl("/auth/loginProc") // 스프링 시큐리티가 해당 주소로 요청오는 로그인을 가로챈다.
.defaultSuccessUrl("/");
;
}
}
2. PrincipalDetail
package com.leo.blog.config.auth;
import com.leo.blog.model.User;
import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
// 스프링 시큐리티가 로그인 요청을 가로채서 로그인을 진행하고 완료가 되면 UserDetails 타입의 오브젝트를
// 스프링 시큐리티의 고유한 세션저장소에 저장을 해준다.
@Getter
public class PrincipalDetail implements UserDetails {
private User user; // 콤포지션(extends와 다름)
public PrincipalDetail(User user){
this.user = user;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
// 계정이 만료되지 않았는지 리턴한다.(true : 만료안됨)
@Override
public boolean isAccountNonExpired() {
return true;
}
// 계정이 잠겨있지 않았는지 리턴한다.(true : 만료안됨)
@Override
public boolean isAccountNonLocked() {
return true;
}
// 비밀번호가 만료되지 않았는지 리턴한다.(true : 만료안됨)
@Override
public boolean isCredentialsNonExpired() {
return true;
}
// 계정이 활성화(사용가능)인지 리턴한다. (true : 활성화)
@Override
public boolean isEnabled() {
return true;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collectors = new ArrayList<>();
// 계정이 갖고있는 권한 목록을 리턴한다. (권한이 여러개 있을 수 있어서 루프를 돌아야 하는데 일단 한개만)
// collectors.add(new GrantedAuthority() {
// @Override
// public String getAuthority() {
// return "ROLE_" + user.getRole(); // ex : ROLE_USER
// }
// });
// 위와 동일
collectors.add(() -> {return "ROLE_"+user.getRole();});
return collectors;
}
}
3. PrincipalDetailService
package com.leo.blog.config.auth;
import com.leo.blog.model.User;
import com.leo.blog.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class PrincipalDetailService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
// 스프링이 로그인 요청을 가로챌때 ,username, password 변수 2개를 가로채는데
// password 부분 처리는 알아서 함.
// 나는 해당 username이 DB에 있는지만 확인해주면 된다.
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User principal = userRepository.findByUsername(username)
.orElseThrow(()->{
return new UsernameNotFoundException("해당 사용자를 찾을 수 없습니다. : " + username);
});
return new PrincipalDetail(principal);
}
}
4. User (Model)
package com.leo.blog.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.validator.constraints.UniqueElements;
import javax.persistence.*;
import java.sql.Timestamp;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
// @DynamicInsert // insert시 null인 field를 지워준다
public class User {
@Id // primary key 선언
@GeneratedValue(strategy = GenerationType.IDENTITY) // 플젝에서 연결된 DB 넘버링 방식을 따라간다.
private int id; // auto_increment , sequence
@Column(nullable = false, length = 30)
// @UniqueElements
private String username; // 아이디
@Column(nullable = false, length = 100)
private String password;
@Column(nullable = false, length = 50)
private String email;
// @ColumnDefault("user")
// DB는 RoleType이라는 게 없다.
@Enumerated(EnumType.STRING)
private RoleType role; // admin, user, manager
@CreationTimestamp // 시간자동입력
private Timestamp createDate;
}
728x90
'Spring' 카테고리의 다른 글
[Spring Boot] oauth2 google 로그인 1 (3) | 2021.02.17 |
---|---|
[Spring Boot] 카카오로그인 Token값 받기까지 기록 (1) | 2021.02.15 |
[Spring Boot] spring security 기록용2 (회원수정 관련) (2) | 2021.02.12 |
[Spring Boot] 스프링부트 타임리프 (thymeleaf) 정리 (1) | 2021.02.05 |
[Spring] 스프링 컨트롤러 정리 (1) | 2021.02.05 |
Comments