Skip to content

Commit 5f16db9

Browse files
committed
[Feat, Fix] JwtToken added RidingLocation api fix
1 parent 31af271 commit 5f16db9

13 files changed

+236
-27
lines changed

pom.xml

+13
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@
5858
<artifactId>gson</artifactId>
5959
<version>2.10.1</version>
6060
</dependency>
61+
<dependency>
62+
<groupId>io.jsonwebtoken</groupId>
63+
<artifactId>jjwt</artifactId>
64+
<version>0.9.1</version>
65+
</dependency>
66+
<dependency>
67+
<groupId>org.springframework.security</groupId>
68+
<artifactId>spring-security-core</artifactId>
69+
</dependency>
70+
<dependency>
71+
<groupId>org.springframework.boot</groupId>
72+
<artifactId>spring-boot-starter-security</artifactId>
73+
</dependency>
6174
</dependencies>
6275

6376
<build>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.sba.recordingserver.config;
2+
3+
import com.sba.recordingserver.security.JwtAuthenticationFilter;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
9+
import org.springframework.security.config.http.SessionCreationPolicy;
10+
import org.springframework.web.filter.CorsFilter;
11+
12+
@Configuration
13+
@EnableWebSecurity
14+
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
15+
@Autowired
16+
private JwtAuthenticationFilter jwtAuthenticationFilter;
17+
18+
@Override
19+
protected void configure(HttpSecurity http) throws Exception {
20+
// http 시큐리티 빌더
21+
http.cors() // WebMvcConfig에서 이미 설정했으므로 기본 cors 설정
22+
.and()
23+
.csrf() // csrf는 현재 사용하지 않으므로 disable
24+
.disable()
25+
.httpBasic() // token을 사용하므로 basic 인증 disable
26+
.disable()
27+
.sessionManagement() // session 기반이 아님을 선언
28+
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
29+
.and()
30+
.authorizeRequests() // /와 /autho/** 경로는 인증 안해도 됨
31+
.antMatchers("/", "/member/**").permitAll()
32+
.anyRequest() // /와 /auth/** 이외의 모든 경로는 인증 해야 됨
33+
.authenticated();
34+
35+
// filter 등록
36+
// 매 요청마다
37+
// CorsFilter 실행한 후에
38+
// jwtAuthenticationFilter 실행한다.
39+
40+
http.addFilterAfter(jwtAuthenticationFilter, CorsFilter.class);
41+
// http.addFilterBefore(
42+
// jwtAuthenticationFilter,
43+
// CorsFilter.class
44+
// );
45+
}
46+
}

src/main/java/com/sba/recordingserver/controller/MemberController.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import javax.transaction.Transactional;
99

1010
@RestController
11+
@RequestMapping("/member")
1112
public class MemberController {
1213
@Autowired
1314
MemberService memberService;
@@ -28,7 +29,8 @@ public ResponseNoDataDto registerBicycle(@RequestBody BicycleRegisterRequestDto
2829

2930
@PostMapping(value="/login")
3031
@Transactional
31-
public ResponseNoDataDto login(@RequestBody MemberLoginDto loginRequest) {
32+
public ResponseDataDto login(@RequestBody MemberLoginDto loginRequest) {
33+
System.out.println("login Reqeust");
3234
return memberService.handleLoginRequest(loginRequest);
3335
}
3436

src/main/java/com/sba/recordingserver/controller/RidingLocationController.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.sba.recordingserver.controller;
22

33
import com.sba.recordingserver.dto.ResponseDataDto;
4-
import com.sba.recordingserver.dto.UserLocationDto;
4+
import com.sba.recordingserver.dto.ResponseNoDataDto;
5+
import com.sba.recordingserver.dto.UserLocationResultDto;
56
import com.sba.recordingserver.service.RidingLocationService;
67
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.web.bind.annotation.GetMapping;
@@ -16,8 +17,12 @@ public class RidingLocationController {
1617
RidingLocationService ridingLocationService;
1718

1819
@GetMapping(value = "/riding_location/post_and_get")
19-
public ResponseDataDto<List<UserLocationDto>> postLocationAndGetNearbyUsers(@RequestParam String memberId, @RequestParam Double longitude, @RequestParam Double latitude)
20+
public ResponseDataDto<List<UserLocationResultDto>> postLocationAndGetNearbyUsers(@RequestParam String memberId, @RequestParam Double longitude, @RequestParam Double latitude, @RequestParam Boolean packMode, @RequestParam Double speed)
2021
{
21-
return ridingLocationService.saveLocationAndReturnNearbyUsers(memberId, longitude, latitude);
22+
return ridingLocationService.saveLocationAndReturnNearbyUsers(memberId, longitude, latitude, packMode, speed);
23+
}
24+
@GetMapping(value = "/riding_location/startRiding")
25+
public ResponseNoDataDto prepareForStartRiding(@RequestParam String memberId) {
26+
return ridingLocationService.checkDirtyMemoryRepository(memberId);
2227
}
2328
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.sba.recordingserver.dto;
2+
3+
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.Setter;
7+
8+
@AllArgsConstructor
9+
@Getter
10+
@Setter
11+
public class MemberLoginResultDto {
12+
private String id;
13+
private String nickname;
14+
private String email;
15+
private String token;
16+
}

src/main/java/com/sba/recordingserver/dto/UserLocationDto.java src/main/java/com/sba/recordingserver/dto/UserLocationResultDto.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
@Setter
1111
@ToString
1212
@AllArgsConstructor
13-
public class UserLocationDto {
14-
private String id;
13+
public class UserLocationResultDto {
14+
private String nickname;
1515
private Double longitude;
1616
private Double latitude;
1717
}

src/main/java/com/sba/recordingserver/entity/RidingLocation.java

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class RidingLocation {
3333
@Column private String id;
3434
@Column private Double longitude;
3535
@Column private Double latitude;
36+
@Column private Double speed;
3637

3738

3839
public RidingLocation() {

src/main/java/com/sba/recordingserver/repository/RidingCoordinateMemoryRepository.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
import com.google.gson.Gson;
55

66
import java.util.ArrayList;
7+
import java.util.HashMap;
78
import java.util.List;
89
import java.util.Map;
910

1011
public class RidingCoordinateMemoryRepository {
11-
private static final RidingCoordinateMemoryRepository instance = new RidingCoordinateMemoryRepository();
12+
private static RidingCoordinateMemoryRepository instance = null;
1213

13-
Map<String, List<Coordinate>> memoryRepository;
14+
Map<String, List<Coordinate>> memoryRepository = new HashMap<>();
1415

1516
public static RidingCoordinateMemoryRepository getInstance() {
17+
if (instance == null) {
18+
instance = new RidingCoordinateMemoryRepository();
19+
System.out.println("created MemoryRepository instance");
20+
}
1621
return instance;
1722
}
1823

@@ -31,6 +36,8 @@ public void remove(String id) {
3136
memoryRepository.remove(id);
3237
}
3338
public String findById(String id) {
39+
if(!memoryRepository.containsKey(id))
40+
return null;
3441
List<Coordinate> list = memoryRepository.get(id);
3542
String json = new Gson().toJson(list);
3643
memoryRepository.remove(id);

src/main/java/com/sba/recordingserver/repository/RidingLocationRepository.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
public interface RidingLocationRepository extends JpaRepository<RidingLocation,String> {
1919

20-
@Query(nativeQuery = true ,value="select l.id,l.longitude,l.latitude from ( select *, ST_Distance_Sphere(point(m.longitude,m.latitude),point(:longitude,:latitude)) as distance from riding_location m ) l where l.distance < 1000 and (l.id != :memberId) order by l.distance")
21-
List<RidingLocation> findNearbyUsers(@Param("memberId") String memberId, @Param("longitude") Double longitude, @Param("latitude") Double latitude);
20+
@Query(nativeQuery = true ,value="select l.id,l.longitude,l.latitude,l.speed from ( select *, ST_Distance_Sphere(point(m.longitude,m.latitude),point(:longitude,:latitude)) as distance from riding_location m ) l where l.distance < 100000 and (l.id != :memberId) and l.speed = :speed order by l.distance")
21+
List<RidingLocation> findNearbyUsers(@Param("memberId") String memberId, @Param("longitude") Double longitude, @Param("latitude") Double latitude, @Param("speed") Double speed);
2222

2323

2424
// @NamedNativeQuery(nativeQuery = true ,value="select * from ( select *, ST_Distance_Sphere(point(m.longitude,m.latitude),point(:longitude,:latitude)) as distance from riding_location m ) l where l.distance < 1000 and (l.id != :memberId) order by l.distance")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.sba.recordingserver.security;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.security.authentication.AbstractAuthenticationToken;
6+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
7+
import org.springframework.security.core.authority.AuthorityUtils;
8+
import org.springframework.security.core.context.SecurityContext;
9+
import org.springframework.security.core.context.SecurityContextHolder;
10+
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
11+
import org.springframework.stereotype.Component;
12+
import org.springframework.util.StringUtils;
13+
import org.springframework.web.filter.OncePerRequestFilter;
14+
15+
import javax.servlet.FilterChain;
16+
import javax.servlet.ServletException;
17+
import javax.servlet.http.HttpServletRequest;
18+
import javax.servlet.http.HttpServletResponse;
19+
import java.io.IOException;
20+
21+
@Slf4j
22+
@Component
23+
public class JwtAuthenticationFilter extends OncePerRequestFilter {
24+
@Autowired
25+
private TokenProvider tokenProvider;
26+
@Override
27+
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
28+
try {
29+
String token = parseBearerToken(request);
30+
System.out.println("parsing");
31+
if(token != null && !token.equalsIgnoreCase(null)) {
32+
String userId = tokenProvider.validateAndGetUserId(token);
33+
System.out.println(userId);
34+
AbstractAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userId,null, AuthorityUtils.NO_AUTHORITIES);
35+
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
36+
SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
37+
securityContext.setAuthentication(authenticationToken);
38+
SecurityContextHolder.setContext(securityContext);
39+
}
40+
} catch(Exception e) {
41+
e.printStackTrace();
42+
}
43+
filterChain.doFilter(request,response);
44+
}
45+
46+
private String parseBearerToken(HttpServletRequest request) {
47+
String bearerToken = request.getHeader("Authorization");
48+
if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer")) {
49+
return bearerToken.substring(7);
50+
}
51+
else
52+
return null;
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.sba.recordingserver.security;
2+
3+
import com.sba.recordingserver.entity.Member;
4+
import io.jsonwebtoken.Claims;
5+
import io.jsonwebtoken.Jwts;
6+
import io.jsonwebtoken.SignatureAlgorithm;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.stereotype.Service;
9+
10+
import javax.crypto.SecretKey;
11+
import java.time.Instant;
12+
import java.time.temporal.ChronoUnit;
13+
import java.util.Date;
14+
15+
@Slf4j
16+
@Service
17+
public class TokenProvider {
18+
private static final String SECRET_KEY = "NMA8JPctFuna59f5";
19+
20+
public String create(Member member) {
21+
Date expiryDate = Date.from(Instant.now().plus(1, ChronoUnit.DAYS));
22+
return Jwts.builder()
23+
.signWith(SignatureAlgorithm.HS512,SECRET_KEY)
24+
.setSubject(member.getId())
25+
.setIssuer("S-BA")
26+
.setIssuedAt(new Date())
27+
.setExpiration(expiryDate)
28+
.compact();
29+
}
30+
public String validateAndGetUserId(String token) {
31+
Claims claims = Jwts.parser()
32+
.setSigningKey(SECRET_KEY)
33+
.parseClaimsJws(token)
34+
.getBody();
35+
return claims.getSubject();
36+
}
37+
}

src/main/java/com/sba/recordingserver/service/MemberService.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.sba.recordingserver.entity.Member;
66
import com.sba.recordingserver.repository.BicycleRepository;
77
import com.sba.recordingserver.repository.MemberRepository;
8+
import com.sba.recordingserver.security.TokenProvider;
89
import com.sba.recordingserver.util.Util;
910
import lombok.AllArgsConstructor;
1011
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +27,9 @@ public class MemberService {
2627
@Autowired
2728
private final BicycleRepository bicycleRepository;
2829

30+
@Autowired
31+
private TokenProvider tokenProvider;
32+
2933
private JavaMailSender emailSender;
3034

3135

@@ -47,22 +51,24 @@ public ResponseNoDataDto registerMember(MemberDto member) {
4751

4852

4953

50-
public ResponseNoDataDto handleLoginRequest(MemberLoginDto loginRequest) {
54+
public ResponseDataDto<MemberLoginResultDto> handleLoginRequest(MemberLoginDto loginRequest) {
5155
Optional<Member> optionalMember = memberRepository.findById(loginRequest.getId());
56+
MemberLoginResultDto memberLoginResultDto = null;
5257
if(optionalMember.isEmpty())
5358
{
5459
System.out.println(loginRequest.getId() + " is not in member db");
55-
return new ResponseNoDataDto("no such id",406);
60+
return new ResponseDataDto("no such id",406, null);
5661
}
5762
else if(!optionalMember.get().getPassword().equals(loginRequest.getPassword()))
5863
{
5964
System.out.println("invalid password " + optionalMember.get().getPassword() + " : " + loginRequest.getPassword());
60-
return new ResponseNoDataDto("invalid password",406);
65+
return new ResponseDataDto("invalid password",406,null);
6166
}
6267
else
6368
{
6469
System.out.println("login request for "+loginRequest.getId() + " successfully done");
65-
return new ResponseNoDataDto("welcome " +optionalMember.get().getNickname(),200);
70+
final String token = tokenProvider.create(optionalMember.get());
71+
return new ResponseDataDto("OK",200,new MemberLoginResultDto(optionalMember.get().getId(),optionalMember.get().getNickname(), optionalMember.get().getEmail(), token));
6672
}
6773
}
6874

0 commit comments

Comments
 (0)