인증과 권한 설계React+REST API 게시판 구현/BE - TypeORM2021. 9. 24. 17:50
Table of Contents
엔티티 설계
- 사용자는 여러가지 권한을 가질 수 있고 권한은 여러명의 사용자를 가질 수 있다.
- 사용자와 권한은 many to many 관계를 가진다고 볼 수 있지만 DB에서 many to many 관계를 직접적으로 가질수는 없고 반드시 중간에 mapping 테이블을 가져하고 사용자와 mapping 테이블은 one to many 관계를 가져야 하고 역할과 mapping 테이블도 one to many 관계를 가지도록 설계해야 한다.
- typeORM에서는 many to many 관계를 설정하면 mapping 테이블을 자동으로 만들어준다!
사용자 엔티티
- src 아래 entity 폴더에 사용자 엔티티(테이블)을 설계하자.
- mapping 테이블의 이름은 user_role이다.
src/entity/User.ts
- email을 unique 처리하기 위해서 @Entitiy 아래에 @Unique([’email’]) 를 적용했다.
- @ManyToMany 어노테이션을 보면 아래에 @JoinTable 어노테이션을 사용해서 user와 user_role 사이에 one-to-many 관계가 성립하게 하고 user_id를 foreign key로 설정했다.
import {
Column,
CreateDateColumn,
Entity,
JoinTable,
ManyToMany,
PrimaryGeneratedColumn,
Unique,
UpdateDateColumn
} from "typeorm";
import {Role} from "./Role";
@Entity()
@Unique(['email'])
export class User {
@PrimaryGeneratedColumn({type: "bigint"})
id: number;
@Column({length: 255})
email: string;
@Column({length: 255})
password: string;
@Column({length: 255})
username: string;
@CreateDateColumn()
created: Date;
@UpdateDateColumn()
updated: Date;
@ManyToMany(() => Role, role => role.users)
@JoinTable({
name: "user_role",
joinColumn: {name: "user_id", referencedColumnName: "id"},
inverseJoinColumn: {name: "role_id", referencedColumnName: "id"}
})
roles: Role[];
}
권한 엔티티
- src 아래 entity 폴더에 권한 엔티티(테이블)을 설계하자.
- mapping 테이블의 이름은 user_role이다.
src/entity/User.ts
- @ManyToMany 어노테이션을 보면 아래에 @JoinTable 어노테이션을 사용해서 role과 user_role 사이에 one-to-many 관계가 성립하게 하고 role_id를 foreign key로 설정했다.
import {
Column,
CreateDateColumn,
Entity,
JoinTable,
ManyToMany,
PrimaryGeneratedColumn,
UpdateDateColumn
} from "typeorm";
import {User} from "./User";
@Entity()
export class Role {
@PrimaryGeneratedColumn()
id: number;
@Column({length: 20})
name: string;
@CreateDateColumn()
created: Date;
@UpdateDateColumn()
updated: Date;
@ManyToMany(() => User, user => user.roles)
@JoinTable({
name: "user_role",
joinColumn: {name: "role_id", referencedColumnName: "id"},
inverseJoinColumn: {name: "user_id", referencedColumnName: "id"}
})
users: User[];
}
권한 데이터 입력
- 웹사이트 UI 화면에 따라 필요한 role들을 정의하고 미리 입력해야 한다.
- ROLE_ADMIN(관리자), ROLE_MANAGER(중간 관리자), ROLE_USER(일반 사용자) 3개를 정의하고 입력하자.
- DB를 우클릭 후 New -> Query Console을 눌러서 쿼리 문을 입력하는 콘솔창을 열자.
- 그리고 아래 쿼리문을 입력한 후 좌측 상단의 실행 버튼을 누르자.
insert into role (name) values ('ROLE_ADMIN');
insert into role (name) values ('ROLE_MANAGER');
insert into role (name) values ('ROLE_USER');
ADMIN 권한
- 관리자 사이트가 따로 있다고 가정하고 ADMIN 권한을 설정하자.
컨트롤 모듈화
- src 아래 contoller 폴더에 AdminController.ts 파일을 생성하자.
- 관리자 사이트에 필요한 모든 API가 여기 정의되지만 getDashboard라는 더미 api를 생성하자.
src/controller/AdminController.ts
export class AdminController {
static getDashboard = async (req, res) => {
res.send('success');
}
}
라우팅 모듈화
- src 아래 router 폴더에 admin.ts 파일을 생성하고 라우팅을 설정하자.
src/router/admin.ts
import {AdminController} from "../controller/AdminController";
import {Router} from "express";
const routes = Router();
routes.get('/dashboard', AdminController.getDashboard);
export default routes;
- 그리고 src 아래 router 폴더에 있는 index.ts 파일에 서브라우팅을 처리하자.
import {Router} from "express";
...
// src/router/admin.ts 라우팅 모듈
import admin from "./admin"
const routes = Router();
...
routes.use('/admin',admin)
...
export default routes;
'React+REST API 게시판 구현 > BE - TypeORM' 카테고리의 다른 글
미들웨어 설정 + 추가 라우팅 (0) | 2021.09.26 |
---|---|
회원가입, 로그인 구현 (0) | 2021.09.24 |
commet CRUD API (0) | 2021.09.24 |
board에 image 추가하기 (0) | 2021.09.24 |
board 추가/보기(페이징)/수정/삭제 API (0) | 2021.09.20 |
@덕구공 :: Duck9s'
주니어 개발자에욤
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!