Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
students
travel
Commits
417c92f8
Commit
417c92f8
authored
Jul 19, 2022
by
Yoon, Daeki
😅
Browse files
role 기능 추가
parent
fd35bfb8
Changes
12
Hide whitespace changes
Inline
Side-by-side
migrations/create.admin.ts
View file @
417c92f8
...
...
@@ -14,12 +14,16 @@ const roles = [
connect
(
mongoUri
)
.
then
(
async
(
mongoose
)
=>
{
const
adminRole
=
await
Role
.
findOne
({
name
:
"
admin
"
});
if
(
!
adminRole
)
{
throw
new
Error
(
"
admin role이 없습니다. 먼저 role 테이블을 만드세요.
"
);
}
await
userDb
.
createUser
({
email
:
"
admin@example.com
"
,
name
:
"
admin
"
,
role
:
adminRole
?.
_id
,
password
:
"
asdfasdf
"
,
});
console
.
log
(
"
admin 계정이 만들어졌습니다.
"
);
await
mongoose
.
disconnect
();
})
.
catch
((
error
)
=>
console
.
log
(
"
롤 초기 생성 에러
"
,
error
));
src/controllers/auth.controller.ts
View file @
417c92f8
...
...
@@ -4,12 +4,41 @@ import jwt, { JwtPayload } from "jsonwebtoken";
import
isLength
from
"
validator/lib/isLength
"
;
import
isEmail
from
"
validator/lib/isEmail
"
;
import
{
asyncWrap
}
from
"
../helpers
"
;
import
{
userDb
}
from
"
../db
"
;
import
{
roleDb
,
userDb
}
from
"
../db
"
;
import
{
jwtCofig
,
envConfig
,
cookieConfig
}
from
"
../config
"
;
export
interface
TypedRequestAuth
<
T
>
extends
Request
{
auth
:
T
;
}
/**
* 지정된 역할 이상으로 권한이 있는지를 판단하는 미들웨어를 반환합니다.
* @param roleName 역할 문자열
* @returns 미들웨어
*/
export
const
hasRole
=
(
roleName
:
string
)
=>
{
// roleName 이상으로 허락하는 것
return
async
(
reqExp
:
Request
,
res
:
Response
,
next
:
NextFunction
)
=>
{
const
req
=
reqExp
as
TypedRequestAuth
<
{
userId
:
string
}
>
;
if
(
!
req
.
auth
)
{
return
res
.
status
(
401
).
send
(
"
로그인이 필요합니다
"
);
}
const
{
userId
}
=
req
.
auth
;
if
(
!
(
await
userDb
.
isValidUserId
(
userId
)))
{
return
res
.
status
(
401
).
send
(
"
유효한 사용자가 아닙니다
"
);
}
const
userRole
=
await
roleDb
.
findRoleByUserId
(
userId
);
const
maxRole
=
await
roleDb
.
findRoleByName
(
roleName
);
if
(
maxRole
&&
Number
(
maxRole
.
priority
)
>=
Number
(
userRole
.
priority
))
{
return
next
();
}
else
{
return
res
.
status
(
401
).
send
(
"
이용 권한이 없습니다
"
);
}
};
};
export
const
login
=
asyncWrap
(
async
(
req
,
res
)
=>
{
const
{
email
,
password
}
=
req
.
body
;
console
.
log
(
`email:
${
email
}
, password:
${
password
}
`
);
...
...
src/controllers/index.ts
View file @
417c92f8
export
*
as
userCtrl
from
"
./user.controller
"
;
export
*
as
authCtrl
from
"
./auth.controller
"
;
export
*
as
postCtrl
from
"
./post.controller
"
;
export
*
as
roleCtrl
from
"
./role.controller
"
;
export
*
as
userCtrl
from
"
./user.controller
"
;
src/controllers/role.controller.ts
0 → 100644
View file @
417c92f8
import
{
roleDb
}
from
"
../db
"
;
import
{
asyncWrap
}
from
"
../helpers
"
;
export
const
getRoles
=
asyncWrap
(
async
(
req
,
res
,
next
)
=>
{
const
roles
=
await
roleDb
.
getAllRoles
();
return
res
.
json
(
roles
);
});
src/db/index.ts
View file @
417c92f8
export
*
as
user
Db
from
"
./
user
.db
"
;
export
*
as
role
Db
from
"
./
role
.db
"
;
export
*
as
postDb
from
"
./post.db
"
;
export
*
as
userDb
from
"
./user.db
"
;
src/db/role.db.ts
0 → 100644
View file @
417c92f8
import
{
Role
,
User
}
from
"
../models
"
;
export
const
findRoleById
=
async
(
roleId
:
string
)
=>
{
const
role
=
await
Role
.
findById
(
roleId
);
return
role
;
};
export
const
findRoleByName
=
async
(
roleName
:
string
)
=>
{
const
role
=
await
Role
.
findOne
({
name
:
roleName
});
return
role
;
};
export
const
findRoleByUserId
=
async
(
userId
:
string
)
=>
{
const
user
=
await
User
.
findById
(
userId
).
populate
(
"
role
"
);
const
role
=
user
?.
get
(
"
role
"
);
return
role
;
};
export
const
getAllRoles
=
async
()
=>
{
const
roles
=
await
Role
.
find
({});
return
roles
;
};
src/db/user.db.ts
View file @
417c92f8
import
bcrypt
from
"
bcryptjs
"
;
import
{
IUser
,
User
}
from
"
../models
"
;
import
{
IUser
,
Role
,
User
}
from
"
../models
"
;
export
const
createUser
=
async
(
user
:
IUser
)
=>
{
// 비밀번호 암호화
const
hash
=
await
bcrypt
.
hash
(
user
.
password
,
10
);
const
newUser
=
await
User
.
create
({
// 사용자 역할 추가: 기본값은 "user"
let
userRole
=
null
;
if
(
user
.
role
)
{
userRole
=
await
Role
.
findById
(
user
.
role
);
}
else
{
userRole
=
await
Role
.
findOne
({
name
:
"
user
"
});
}
const
newUser
=
new
User
({
email
:
user
.
email
,
password
:
hash
,
name
:
user
.
name
,
role
:
userRole
,
isNew
:
true
,
});
return
newUser
;
const
retUser
=
await
newUser
.
save
();
return
retUser
;
};
export
const
findUserByEmail
=
async
(
...
...
@@ -25,6 +34,11 @@ export const findUserByEmail = async (
return
user
;
};
export
const
getProfile
=
async
(
userId
:
string
)
=>
{
const
profile
=
await
User
.
findById
(
userId
);
return
profile
;
//이름 수정
};
export
const
getUsers
=
async
()
=>
{
const
users
=
await
User
.
find
({});
return
users
;
...
...
@@ -39,7 +53,11 @@ export const isUser = async (email: string) => {
}
};
export
const
getProfile
=
async
(
userId
:
string
)
=>
{
const
profile
=
await
User
.
findById
(
userId
)
return
profile
//이름 수정
}
\ No newline at end of file
export
const
isValidUserId
=
async
(
userId
:
string
)
=>
{
const
user
=
await
User
.
findById
(
userId
);
if
(
user
)
{
return
true
;
}
else
{
return
false
;
}
};
src/models/index.ts
View file @
417c92f8
export
{
default
as
User
,
IUser
}
from
"
./user.model
"
;
export
{
default
as
Post
,
PostType
}
from
"
./post.model
"
;
export
{
default
as
Role
}
from
"
./role.model
"
;
src/models/post.model.ts
View file @
417c92f8
import
{
Document
,
model
,
Schema
,
Types
}
from
"
mongoose
"
;
import
{
Posting
}
from
"
.
"
;
import
{
model
,
Schema
,
Types
}
from
"
mongoose
"
;
export
interface
PostType
{
title
:
string
;
...
...
src/models/role.model.ts
View file @
417c92f8
...
...
@@ -5,9 +5,12 @@ interface IRole {
priority
:
number
;
}
const
schema
=
new
Schema
<
IRole
>
({
name
:
{
type
:
String
},
priority
:
{
type
:
Number
},
});
const
schema
=
new
Schema
<
IRole
>
(
{
name
:
{
type
:
String
},
priority
:
{
type
:
Number
},
},
{
toJSON
:
{
versionKey
:
false
}
}
);
export
default
model
<
IRole
>
(
"
Role
"
,
schema
);
src/routes/role.route.ts
0 → 100644
View file @
417c92f8
import
express
from
"
express
"
;
import
{
authCtrl
,
roleCtrl
}
from
"
../controllers
"
;
const
router
=
express
.
Router
();
router
.
all
(
"
/
"
,
authCtrl
.
requireLogin
);
router
.
route
(
"
/
"
).
get
(
authCtrl
.
hasRole
(
"
admin
"
),
roleCtrl
.
getRoles
);
export
default
router
;
src/routes/user.route.ts
View file @
417c92f8
...
...
@@ -6,6 +6,6 @@ const router = express.Router();
router
.
route
(
"
/
"
)
.
get
(
authCtrl
.
requireLogin
,
userCtrl
.
getUsers
)
.
post
(
authCtrl
.
requireLogin
,
userCtrl
.
createUser
);
.
post
(
authCtrl
.
requireLogin
,
authCtrl
.
hasRole
(
"
admin
"
),
userCtrl
.
createUser
);
export
default
router
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment