RestController에서
@Configuration
어노테이션을 붙이면 jwt필터에 모두 걸린다
특정주소만을 필터링 하길 원한다면
filterconfig에서 주소를 설정해 준다
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;
}
}
<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>
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;
}
}