20221019 [Spring Boot, Vue.js]

Yeoonnii·2022년 10월 21일
0

TIL

목록 보기
50/52
post-thumbnail

회원정보수정

RestController에서
@Configuration 어노테이션을 붙이면 jwt필터에 모두 걸린다

특정주소만을 필터링 하길 원한다면
filterconfig에서 주소를 설정해 준다

FilterConfig.java

package com.example.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.example.jwt.JwtFilter;

// 필터를 통과할 url설정하기
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtFilter> 
        filterRegistrationBean(JwtFilter jwtFilter){

        FilterRegistrationBean<JwtFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(jwtFilter);    

        // ex) 회원정보수정, 판매자페이지전체는 jwtFilter동작됨
        bean.addUrlPatterns("/api/member/update.json", 
            "/api/seller/*", "/api/member/selectone.json");

        return bean;
    }
}

components/comp/Menu1Page.vue

<template>
    <div>
        <h3>{{ title }}</h3>
        나이   : <input type="text" v-model="age" />
        연락처 : <input type="text" v-model="phone" />
        <button>정보수정</button>
    </div>
</template>

<script>
import { reactive, toRefs } from '@vue/reactivity'
import { onMounted } from '@vue/runtime-core';
import axios from 'axios';
export default {
    props : {
        title : String
    },
    setup (props, {emit}) {

        const state = reactive({
            age   : 0,
            phone : '',
            title : props.title,
            token : sessionStorage.getItem("token")
        });

        const handleData = async() => {
            const url = `/ROOT/api/member/selectone.json`;
            const headers = {
                "Content-Type"  : "application/json",
                "TOKEN"         : state.token
            }
            const { data } = await axios.get(url, {headers});
            console.log(data);
        };

        onMounted(() => {
            handleData();
        });

        const handleEmit = () => {
            // 부모쪽으로 이벤트 발생
            emit('sendData',{key:'a', value:'b'});
        }

        return {
            ...toRefs(state),
            handleEmit
        }
    }
}
</script>

<style lang="scss" scoped>

</style>

MemberRestController.java

package com.example.restcontroller;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.entity.Member;
import com.example.jwt.JwtUtil;
import com.example.repository.MemberRepository;

import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping(value = "/api/member")
@RequiredArgsConstructor
public class MemberRestController {

    final PasswordEncoder passwordEncoder;
    final AuthenticationManager authenticationManager;
    final MemberRepository memberRepository;
    final JwtUtil jwtUtil;

    // JwtFilter를 통과한 후에 request에 아이디와 권한정보를 저장하고
    // 여기로 수행됨. 여기서는 request를 통해서 아이디 정보 꺼냄
    @GetMapping(value="/selectone.json")
    public Map<String, Object> selectoneGET(
                HttpServletRequest request ){
        Map<String, Object> map = new HashMap<>();
        try {
            // 여기서 아이디 정보 꺼냄
            String username 
                = (String) request.getAttribute("username");
            Member member 
                = memberRepository.findById(username).orElse(null);
            map.put("status", 200);
            map.put("result", member);
        }
        catch(Exception e) {
            map.put("status", -1);
            map.put("result", e.getMessage());
        }
        return map;
    }


    // 127.0.0.1:8080/ROOT/api/member/idcheck.json?userid=아이디
    @GetMapping(value="/idcheck.json")
    public Map<String, Object> idcheckGET(
            @RequestParam(name="userid") String userid ){
        Map<String, Object> map = new HashMap<>();
        try {
            boolean ret = memberRepository.existsById(userid);
            map.put("status", 200);
            map.put("result", ret); //있으면 참, 없으면 거짓
        }
        catch(Exception e) {
            map.put("status", -1);
            map.put("result", e.getMessage());
        }
        return map;
    }


    // 회원정보 수정은 토큰 검증 후에 처리
    @PutMapping(value="/update.json")
    public Map<String, Object> updatePUT(
                HttpServletRequest request,
                @RequestBody Member member){
        Map<String, Object> map = new HashMap<>();
        try {
            String username = (String) request.getAttribute("username");
            String role = (String) request.getAttribute("role");

            // 기존정보 읽기
            Member member1 = memberRepository.findById(username).orElse(null);
            // 변경항목 객체에 추가
            member1.setPhone(member.getPhone());
            member.setAge(member.getAge());
            // 다시 저장하기
            memberRepository.save(member1);

            map.put("status", 200);
            map.put("result", username+","+role);
        }
        catch(Exception e) {
            map.put("status", -1);
            map.put("result", e.getMessage());
        }
        return map;
    }


    
    // {"userid":"c5", "userpw":"c5", "role":"CUSTOMER" }
    @PostMapping(value = "/login.json")
    public Map<String, Object> loginPOST(
                @RequestBody Member member){
        Map<String, Object> map = new HashMap<>();
        try {
            // 1. 권한 정보 변경을 위한 문자배열
            String[] strRole = { member.getRole() };

            // 2. 문자배열을 Collection타입으로 변환
            Collection<GrantedAuthority> role 
                = AuthorityUtils.createAuthorityList(strRole);

            // 3. 매니저을 이용한 인증, detailsService와 같은 기능
            UsernamePasswordAuthenticationToken token = 
                new UsernamePasswordAuthenticationToken(
                    member.getUserid(), member.getUserpw(), null);
            authenticationManager.authenticate(token);

            map.put("status", 200);
            map.put("result", jwtUtil.generateToken(
                    member.getUserid(), member.getRole()));
        }
        catch(Exception e) {
            map.put("status", -1);
            map.put("result", e.getMessage());
        }
        return map;
    }

    
    // 127.0.0.1:8080/ROOT/api/member/join.json
    @PostMapping(value="/join.json")
    public Map<String, Object> joinPOST(@RequestBody Member member) {
        System.out.println(member.toString());
        Map<String, Object> map = new HashMap<>();
        try {
            String hashpw = passwordEncoder.encode(member.getUserpw());
            member.setUserpw(hashpw);
            memberRepository.save(member);
            map.put("status", 200);
        }
        catch(Exception e) {
            map.put("status", -1);
            map.put("result", e.getMessage());
        }
        return map;
    }
    
}

0개의 댓글