@Configuration
public class WebSecurityConfig {
// TODO: 스프링 시큐리티 설치 (보안모드) : 이미지,css,js 등은 보안 비활성화(무시)
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().requestMatchers(
"/img/",
"/css/",
"/js/**"
);
}
// TODO: 함수 : 보안 설정 예) 부서/사원메뉴 실행할수있게 허용
// => 화면의 CRUD 기능을 허용/불가 설정을 하는것
// => cors 보안 : 1개의 컴퓨터에서 포트번호 및 ip를 여러개 사용할수 있게 하는 설정
// 예) vue (8080) <-> springboot(8000) : x(기본) -> o(허용)
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors(Customizer.withDefaults()); // 1) cors 보안설정 사용
http.csrf((csrf) -> csrf.disable()); // 2) csrf 해킹공격(쿠키/세션 인증) 방어 비활성화
http.sessionManagement(sessionManagement
-> sessionManagement
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); // 3) 쿠키/세션 인증 비활성화(다른인증사용)
http.formLogin(req -> req.disable()); // 4) jsp 방식 비활성화 -> axios 통신사용
// TODO: 본격적 : 화면별 보안설정 : 예) 부서화면 모두(CRUD) 허용, 사원 허용안함
// 용어 : 인증(authentication) / 권한(authority)
// 1) 인증 : 로그인하는것 (id/pwd 확인)
// 2) 권한 : 화면별로 (관리자/유저) 관리자가 볼수 있는것,
// 유저가 볼수 있는것을 나눈것
http.authorizeHttpRequests(
req -> req.dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() // 옵션(페이지이동 허용)
.requestMatchers("/api/auth/").permitAll() // 이 url 은 모두 접근 허용(로그인 관계없이)
.requestMatchers("/api/admin/").hasRole("ADMIN") // 이 url 은 ROLE_ADMIN 만 접근 허용(로그인 해야함)
.requestMatchers("/api/basic/dept/**").permitAll() // 부서 url 은 모두 접근 허용(로그인 관계없이)
.requestMatchers("/").permitAll() // 부서 url 은 모두 접근 허용(로그인 관계없이)
.anyRequest().authenticated()); // 나머지 url 은 로그인해야 볼수 있음
return http.build(); // 권한/인증 규칙 설정완료(반영)
}
}
=>
*맵퍼
public long existsByid(String email);
*xml
select id="existsByid" parameterType="String" resultType="long"
SELECT COUNT(*)
FROM TB_MEMBER
WHERE EMAIL = #{email}
/select
*서비스
public void insert(Member member) {
// 1) 유효성체크 : 이사람이 이미 가입된 사람인지 확인
if(memberMapper.existsByid(member.getEmail()) > 0) {
throw new NoSuchElementException("같은 이메일의 회원이 있습니다 ");
}
// 2) 회원가입(insert) : TODO: 암호화 적용필요(라이브러리 : Bcrpt (스프링시큐리티 안에 포함))
// bcrypt : 단방향 암호화(해싱 암호화) : 암호화 되고 복호화안되는것
member.setPassword(passwordEncoder.encode(member.getPassword()));
memberMapper.insert(member);
}