개발/술Talk

[ BE - JS ] 로그인, 회원가입, 로그아웃 구현

황성안 2021. 8. 2. 13:19
728x90

로그인, 회원가입

Maria DB 를 연동하여 만들었습니다.

Maria DB 유저테이블

추후 수정될 것으로 예상된다.

유저 넘버

ID

PW

Nickname

email

일단 위 DB로만 구성하였으며 추후 ERD는 수정될수있습니다.

CREATE TABLE `users` (
    `USERSNO` INT(11) NOT NULL AUTO_INCREMENT,
    `id` VARCHAR(20) NOT NULL COLLATE 'utf8mb3_general_ci',
    `pw` VARCHAR(20) NOT NULL COLLATE 'utf8mb3_general_ci',
    `nickname` VARCHAR(20) NOT NULL COLLATE 'utf8mb3_general_ci',
    `email` VARCHAR(20) NOT NULL COLLATE 'utf8mb3_general_ci',
    PRIMARY KEY (`USERSNO`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4
;

UserController.java

src - main - java - talk.server - UserController.java

package talk.server.controller;

import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import talk.server.jwt.JwtTokenProvider;
import talk.server.service.UserService;
import talk.server.vo.User;
import talk.server.vo.resLoginUser;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Api(tags = {"회원관련 컨트롤러"})
@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    // 일반, 소셜 회원가입 로그인 구분

    @PostMapping("/signup")
    public String signup(@RequestBody Map<String, String> map) {
        // 회원 가입 로직
        //닉네임 중복검사
        int dcNicnName = userService.getUserByNickName(map.get("nickname"));
        if (dcNicnName >= 1) return "nickname";
        //username (ID) 중복검사
        int dcUserName = userService.getUserByUserName(map.get("username"));
        if (dcUserName >= 1) return "username";

        boolean result = userService.setUser(map);
        if (result) return "success";
        else return "failure";
    }

    @PostMapping("/signin")
    public ResponseEntity<resLoginUser> signin(@RequestBody Map<String, String> map) {
        // 로그인 로직
        // id 확인
        int dcUserName = userService.getUserByUserName(map.get("username"));
        // id가 없는 경우
        if (dcUserName == 0) {
            resLoginUser result = new resLoginUser();
            result.setResult("noid");
            return new ResponseEntity(result, HttpStatus.OK);
        }
        User user = userService.getUser(map);

        if (user == null) {
            resLoginUser result = new resLoginUser();
            result.setResult("nopassword");
            return new ResponseEntity(result, HttpStatus.OK);
        }

        resLoginUser result = new resLoginUser();

        result.setResult("success");
        result.setNickname(user.getNickname());
        result.setSuccess(true);
        result.setToken(user.getAuth());
        return ResponseEntity.ok(result);

    }
    //로그아웃
    @PostMapping("/logout")
    public ModelAndView logout(HttpSession session) {

        userService.logout(session);
        ModelAndView mav = new ModelAndView();
        mav.setViewName("login");
        mav.addObject("msg","logout");
        return mav;
    }
}

User.java

src - main - java - talk.server - vo - User

package talk.server.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements UserDetails {
    private String email;
    private String id;
    private String password;
    private String nickname;
    private String auth;
    private int enabled;

    private List<String> roles = new ArrayList<>();

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        ArrayList<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();
        authList.add(new SimpleGrantedAuthority("ROLE_USER"));
        return authList;
    }

    @Override
    public String getUsername() {
        return this.id;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}

UserDao.java

src - main - java - talk.server - dao

package talk.server.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements UserDetails {
    private String email;
    private String id;
    private String password;
    private String nickname;
    private String auth;
    private int enabled;

    private List<String> roles = new ArrayList<>();

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        ArrayList<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();
        authList.add(new SimpleGrantedAuthority("ROLE_USER"));
        return authList;
    }

    @Override
    public String getUsername() {
        return this.id;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}

user.xml

resources - mapper - user.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="talk.server.dao.UserDao">

    <select id="getUserByNickName" parameterType="java.lang.String" resultType="java.lang.Integer">
        select count(*) from users where nickname=#{nickname}
    </select>

    <select id="getUserByUserName" parameterType="java.lang.String" resultType="java.lang.Integer">
        select count(*) from users where id=#{username}
    </select>

    <select id="getUser" parameterType="map" resultType="User">
        select * from users where id = #{username} and pw = #{password}
    </select>

    <insert id="setUser" parameterType="map">
        INSERT INTO users VALUES(NULL, #{username}, #{password}, #{nickname}, 'temp');
    </insert>

</mapper>
728x90