SpringSecurity - 회원권한 및 google Oauth2 사용하기

HYK·2022년 5월 13일
0

SpringSecurity

목록 보기
1/1

1. 페이지별 권한주기

  • SecurityConfig에 @EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)애노테이션을 추가해서 각컨트롤러에 적용할 @secured , @preAuthorize 애노테이션을 활성화시킨다.
  • 필요한 페이지에 다음과 같이 적용시킨다
@Secured("ROLE_ADMIN") // 이렇게 한개의 권한만 할때는 Secured를 사용하고
@ResponseBody
@GetMapping("/info")
public String info(){
    return "개인정보";
}

@PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
//두개이상의 권한이 필요할 때에는 PreAuthorize를 사용한다.
@ResponseBody
@GetMapping("/data")
public String data(){

    return "개인정보";

}

2. google Oauth2 사용하기

  1. 먼저 google cloud platform의 api 및 서비스 탭의 OAuth 동의화면으로 이동한다.

1. 페이지별 권한주기

  • SecurityConfig에 @EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)애노테이션을 추가해서 각컨트롤러에 적용할 @secured , @preAuthorize 애노테이션을 활성화시킨다.
  • 필요한 페이지에 다음과 같이 적용시킨다
@Secured("ROLE_ADMIN") // 이렇게 한개의 권한만 할때는 Secured를 사용하고
@ResponseBody
@GetMapping("/info")
public String info(){
    return "개인정보";
}

@PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
//두개이상의 권한이 필요할 때에는 PreAuthorize를 사용한다.
@ResponseBody
@GetMapping("/data")
public String data(){

    return "개인정보";

}

2. google Oauth2 사용하기

  1. 먼저 google cloud platform의 api 및 서비스 탭의 OAuth 동의화면으로 이동한다.

  1. 여기서 OAuth를 만들고 앱과 연결!
    한다.(이메일만 적고 다 생략)

  1. 그다음 사용자 인증정보를 가서 다음과같이 리다이렉션 URL을 적고 클라이언트 id 와 secret 키를 발급받는다.
  1. configure메서드에 체인을 추가한다.
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("/user/**").authenticated() // authenticated는 인증해야한다는것 즉 로그인필요
            .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or  hasRole('ROLE_MANAGER')") //access는 권한이필요하다는것 (로그인포함)
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .anyRequest().permitAll() // 위의 페이지 3개 이외는 아무나 접근하게 해주는 체인.
            .and() //만약에 권한이 없는 페이지로 들어갈때 로그인페이지로 가게해주는 체인.
            .formLogin()
            .loginPage("/loginForm")
            .loginProcessingUrl("/login") //login 주소가 호출되면 시큐리티가 낚아채서 대신 로그인 진행해줌 즉 컨트롤러에 /login필요없음
            .defaultSuccessUrl("/") //로그인 완료됬을대 페이지
            .and()
            .oauth2Login()
            .loginPage("/loginForm") //구글로그인 완료된 후처리 필요
            //1. 코드받기(인증) 2. 엑세스토큰(권한)
            //3. 사용자 프로필 정보를 가져오고 4-1 그정보를 토대로 회원가입을 진행시키거나
            //4-2 기본정보(이메일,아이디,이름,전화번호) 정보가 모자라면 ex) 쇼핑몰 ->(집주소), 백화점몰 ->(등급)
            .userInfoEndpoint()
            .userService(principalOauth2UserService); //Tip. 코드X,(액세스 토큰 +사용자 프로필정보)
}
  1. 체인 맨아래 userService에 추가되는 Service 클래스를 생성한다.
package com.hy.demo.config.oauth;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    // 구글로 부터 받은 userRequest 데이터를 후처리하는 함수
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {

        logger.info("userRequest = " + userRequest.getClientRegistration());
        logger.info("getAccessToken.getTokenValue() = " + userRequest.getAccessToken().getTokenValue());
        logger.info("loadUser(userRequest).getAttributes() = " + super.loadUser(userRequest).getAttributes());
/**  loadUser(userRequest).getAttributes()의 리턴값
* {sub=12312423412341231412345123,
 * name=KsBi kim,
 * given_name=KsBi,
 * family_name=KsBi,
 * picture=https://lh3.google.com/a/AATXAJzPTCeqTDf3ywaH_28lKvL1=s96-c,
 * email=ddha963dw963@gmail.com,
 * email_verified=true,
 * locale=ko}
 *
 *예를 들면 회원가입은
* username = google_12312423412341231412345123이런식으로 하면중복안됌
* password = "암호화(겟인데어)"
 * email = ddha963dw963@gmail.com
 * role = ROLE_USER
 * provider = "google"
 * providerId= ="12312423412341231412345123"이런식으로 저장
* */

return super.loadUser(userRequest);
    }
}
profile
Test로 학습 하기

0개의 댓글