@things-factory/auth-base 6.2.50 → 6.2.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/directive/privileged.ts +1 -1
- package/client/profiled.ts +16 -11
- package/dist-client/directive/privileged.d.ts +2 -2
- package/dist-client/directive/privileged.js.map +1 -1
- package/dist-client/profiled.d.ts +2 -2
- package/dist-client/profiled.js +15 -9
- package/dist-client/profiled.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/domain-generator/domain-generator-mutation.js +1 -1
- package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
- package/dist-server/service/privilege/privilege-directive.js +9 -12
- package/dist-server/service/privilege/privilege-directive.js.map +1 -1
- package/dist-server/service/privilege/privilege-query.d.ts +3 -3
- package/dist-server/service/privilege/privilege-query.js +23 -21
- package/dist-server/service/privilege/privilege-query.js.map +1 -1
- package/dist-server/service/privilege/privilege.d.ts +0 -2
- package/dist-server/service/privilege/privilege.js +0 -8
- package/dist-server/service/privilege/privilege.js.map +1 -1
- package/dist-server/service/user/user.d.ts +2 -2
- package/dist-server/service/user/user.js +5 -5
- package/dist-server/service/user/user.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/check-permission.d.ts +7 -0
- package/dist-server/utils/check-permission.js +38 -0
- package/dist-server/utils/check-permission.js.map +1 -0
- package/package.json +5 -5
- package/server/index.ts +2 -0
- package/server/service/domain-generator/domain-generator-mutation.ts +1 -1
- package/server/service/privilege/privilege-directive.ts +21 -13
- package/server/service/privilege/privilege-query.ts +15 -13
- package/server/service/privilege/privilege.ts +0 -6
- package/server/service/user/user.ts +5 -5
- package/server/utils/check-permission.ts +52 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
import { Domain } from '@things-factory/shell';
|
2
|
+
import { PrivilegeObject } from '../service/privilege/privilege';
|
3
|
+
import { User } from '../service/user/user';
|
4
|
+
export declare function checkPermission(privilegeObject: PrivilegeObject, user: User, domain: Domain, unsafeIP?: boolean, prohibitedPrivileges?: {
|
5
|
+
category: string;
|
6
|
+
privilege: string;
|
7
|
+
}[]): Promise<boolean>;
|
@@ -0,0 +1,38 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.checkPermission = void 0;
|
4
|
+
const user_1 = require("../service/user/user");
|
5
|
+
async function checkPermission(privilegeObject, user, domain, unsafeIP, prohibitedPrivileges) {
|
6
|
+
if (!privilegeObject) {
|
7
|
+
return true;
|
8
|
+
}
|
9
|
+
const { owner: domainOwnerGranted, super: superUserGranted, category, privilege } = privilegeObject;
|
10
|
+
if (unsafeIP) {
|
11
|
+
if (privilege && category) {
|
12
|
+
// unsafeIP 상황에서는 ownership granted는 적용되지 않는다.
|
13
|
+
if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
return await user_1.User.hasPrivilege(privilege, category, domain, user);
|
17
|
+
}
|
18
|
+
// privilege, category가 설정되지 않은 경우에는 ownership granted가 설정되었다면 허가하지 않는다.
|
19
|
+
return !domainOwnerGranted && !superUserGranted;
|
20
|
+
}
|
21
|
+
else {
|
22
|
+
if (!privilege || !category) {
|
23
|
+
// privilege, category가 설정되지 않은 경우에는 ownership granted만을 적용한다.
|
24
|
+
return ((domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
|
25
|
+
(superUserGranted && (await process.superUserGranted(domain, user))));
|
26
|
+
}
|
27
|
+
if ((domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
|
28
|
+
(superUserGranted && (await process.superUserGranted(domain, user)))) {
|
29
|
+
return true;
|
30
|
+
}
|
31
|
+
if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
|
32
|
+
return false;
|
33
|
+
}
|
34
|
+
return await user_1.User.hasPrivilege(privilege, category, domain, user);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
exports.checkPermission = checkPermission;
|
38
|
+
//# sourceMappingURL=check-permission.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"check-permission.js","sourceRoot":"","sources":["../../server/utils/check-permission.ts"],"names":[],"mappings":";;;AAEA,+CAA2C;AAEpC,KAAK,UAAU,eAAe,CACnC,eAAgC,EAChC,IAAU,EACV,MAAc,EACd,QAAkB,EAClB,oBAAgE;IAEhE,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;IAEnG,IAAI,QAAQ,EAAE;QACZ,IAAI,SAAS,IAAI,QAAQ,EAAE;YACzB,8CAA8C;YAC9C,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,QAAQ,IAAI,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;gBACjG,OAAO,KAAK,CAAA;aACb;YAED,OAAO,MAAM,WAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;SAClE;QAED,wEAAwE;QACxE,OAAO,CAAC,kBAAkB,IAAI,CAAC,gBAAgB,CAAA;KAChD;SAAM;QACL,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE;YAC3B,8DAA8D;YAC9D,OAAO,CACL,CAAC,kBAAkB,IAAI,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxE,CAAC,gBAAgB,IAAI,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CACrE,CAAA;SACF;QAED,IACE,CAAC,kBAAkB,IAAI,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACxE,CAAC,gBAAgB,IAAI,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACpE;YACA,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,QAAQ,IAAI,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;YACjG,OAAO,KAAK,CAAA;SACb;QAED,OAAO,MAAM,WAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;KAClE;AACH,CAAC;AA/CD,0CA+CC","sourcesContent":["import { Domain } from '@things-factory/shell'\nimport { PrivilegeObject } from '../service/privilege/privilege'\nimport { User } from '../service/user/user'\n\nexport async function checkPermission(\n privilegeObject: PrivilegeObject,\n user: User,\n domain: Domain,\n unsafeIP?: boolean,\n prohibitedPrivileges?: { category: string; privilege: string }[]\n): Promise<boolean> {\n if (!privilegeObject) {\n return true\n }\n\n const { owner: domainOwnerGranted, super: superUserGranted, category, privilege } = privilegeObject\n\n if (unsafeIP) {\n if (privilege && category) {\n // unsafeIP 상황에서는 ownership granted는 적용되지 않는다.\n if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {\n return false\n }\n\n return await User.hasPrivilege(privilege, category, domain, user)\n }\n\n // privilege, category가 설정되지 않은 경우에는 ownership granted가 설정되었다면 허가하지 않는다.\n return !domainOwnerGranted && !superUserGranted\n } else {\n if (!privilege || !category) {\n // privilege, category가 설정되지 않은 경우에는 ownership granted만을 적용한다.\n return (\n (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||\n (superUserGranted && (await process.superUserGranted(domain, user)))\n )\n }\n\n if (\n (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||\n (superUserGranted && (await process.superUserGranted(domain, user)))\n ) {\n return true\n }\n\n if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {\n return false\n }\n\n return await User.hasPrivilege(privilege, category, domain, user)\n }\n}\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/auth-base",
|
3
|
-
"version": "6.2.
|
3
|
+
"version": "6.2.52",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "dist-client/index.js",
|
6
6
|
"things-factory": true,
|
@@ -30,10 +30,10 @@
|
|
30
30
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
31
31
|
},
|
32
32
|
"dependencies": {
|
33
|
-
"@things-factory/email-base": "^6.2.
|
33
|
+
"@things-factory/email-base": "^6.2.52",
|
34
34
|
"@things-factory/env": "^6.2.33",
|
35
|
-
"@things-factory/i18n-base": "^6.2.
|
36
|
-
"@things-factory/shell": "^6.2.
|
35
|
+
"@things-factory/i18n-base": "^6.2.52",
|
36
|
+
"@things-factory/shell": "^6.2.52",
|
37
37
|
"@things-factory/utils": "^6.2.48",
|
38
38
|
"jsonwebtoken": "^9.0.0",
|
39
39
|
"koa-passport": "^6.0.0",
|
@@ -43,5 +43,5 @@
|
|
43
43
|
"passport-local": "^1.0.0",
|
44
44
|
"popsicle-cookie-jar": "^1.0.0"
|
45
45
|
},
|
46
|
-
"gitHead": "
|
46
|
+
"gitHead": "234f95b63937521f1791a9e2141024ee7816d26d"
|
47
47
|
}
|
package/server/index.ts
CHANGED
@@ -16,6 +16,8 @@ export * from './utils/get-secret'
|
|
16
16
|
export * from './utils/check-user-belongs-domain'
|
17
17
|
export * from './utils/access-token-cookie'
|
18
18
|
export * from './utils/encrypt-state'
|
19
|
+
export * from './utils/check-permission'
|
20
|
+
|
19
21
|
export * from './errors'
|
20
22
|
|
21
23
|
export * from './types'
|
@@ -11,7 +11,7 @@ import { DomainGeneratorInput, DomainUserRoleInput } from './domain-generator-ty
|
|
11
11
|
|
12
12
|
@Resolver()
|
13
13
|
export class DomainGeneratorMutation {
|
14
|
-
@Directive('@privilege(
|
14
|
+
@Directive('@privilege(superUserGranted: true)')
|
15
15
|
@Directive('@transaction')
|
16
16
|
@Mutation(returns => Domain)
|
17
17
|
async domainRegister(
|
@@ -3,6 +3,7 @@ import gql from 'graphql-tag'
|
|
3
3
|
|
4
4
|
import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'
|
5
5
|
import { User } from '../user/user'
|
6
|
+
import { checkPermission } from '../../utils/check-permission'
|
6
7
|
|
7
8
|
process['PRIVILEGES'] = {}
|
8
9
|
|
@@ -33,22 +34,29 @@ export const privilegeDirectiveResolver = (schema: GraphQLSchema) =>
|
|
33
34
|
}
|
34
35
|
|
35
36
|
fieldConfig.resolve = async function (source, args, context, info) {
|
36
|
-
const { domain, user } = context.state
|
37
|
+
const { domain, user, unsafeIP, prohibitedPrivileges } = context.state
|
37
38
|
|
38
|
-
if (
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
39
|
+
if (
|
40
|
+
await checkPermission(
|
41
|
+
{
|
42
|
+
category,
|
43
|
+
privilege,
|
44
|
+
owner: domainOwnerGranted,
|
45
|
+
super: superUserGranted
|
46
|
+
},
|
47
|
+
user,
|
48
|
+
domain,
|
49
|
+
unsafeIP,
|
50
|
+
prohibitedPrivileges
|
51
|
+
)
|
52
|
+
) {
|
49
53
|
return await resolve.call(this, source, args, context, info)
|
50
54
|
} else {
|
51
|
-
throw new Error(
|
55
|
+
throw new Error(
|
56
|
+
`Unauthorized! ${
|
57
|
+
category && privilege ? category + ':' + privilege + ' privilege' : 'ownership granted'
|
58
|
+
} required`
|
59
|
+
)
|
52
60
|
}
|
53
61
|
}
|
54
62
|
|
@@ -8,14 +8,6 @@ import { PrivilegeList } from './privilege-types'
|
|
8
8
|
|
9
9
|
@Resolver(Privilege)
|
10
10
|
export class PrivilegeQuery {
|
11
|
-
@Directive('@privilege(category: "privilege", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
|
12
|
-
@Query(returns => Privilege, { description: 'To fetch privilege' })
|
13
|
-
async privilege(@Arg('name') name: string, @Arg('category') category: string): Promise<Privilege> {
|
14
|
-
return await getRepository(Privilege).findOne({
|
15
|
-
where: { name, category }
|
16
|
-
})
|
17
|
-
}
|
18
|
-
|
19
11
|
@Directive('@privilege(category: "privilege", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
|
20
12
|
@Query(returns => PrivilegeList, { description: 'To fetch multiple privileges' })
|
21
13
|
async privileges(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<PrivilegeList> {
|
@@ -23,7 +15,12 @@ export class PrivilegeQuery {
|
|
23
15
|
params,
|
24
16
|
repository: getRepository(Privilege),
|
25
17
|
alias: 'p',
|
26
|
-
searchables: ['
|
18
|
+
searchables: ['privilege', 'category'],
|
19
|
+
filtersMap: {
|
20
|
+
privilege: {
|
21
|
+
columnName: 'name'
|
22
|
+
}
|
23
|
+
}
|
27
24
|
})
|
28
25
|
.orderBy('p.category', 'ASC')
|
29
26
|
.getManyAndCount()
|
@@ -42,22 +39,22 @@ export class PrivilegeQuery {
|
|
42
39
|
|
43
40
|
@Query(returns => Boolean, { description: 'To query whether I have the given permission' })
|
44
41
|
async hasPrivilege(
|
45
|
-
@Arg('
|
42
|
+
@Arg('privilege') privilege: string,
|
46
43
|
@Arg('category') category: string,
|
47
44
|
@Ctx() context: ResolverContext
|
48
45
|
): Promise<Boolean> {
|
49
46
|
const { domain, user } = context.state
|
50
|
-
return await User.hasPrivilege(
|
47
|
+
return await User.hasPrivilege(privilege, category, domain, user)
|
51
48
|
}
|
52
49
|
|
53
50
|
@Query(returns => [Domain], { description: 'To fetch domains with given privilege for user' })
|
54
51
|
async domainsWithPrivilege(
|
55
|
-
@Arg('
|
52
|
+
@Arg('privilege') privilege: string,
|
56
53
|
@Arg('category') category: string,
|
57
54
|
@Ctx() context: ResolverContext
|
58
55
|
): Promise<Partial<Domain>[]> {
|
59
56
|
const { user } = context.state
|
60
|
-
return await User.getDomainsWithPrivilege(
|
57
|
+
return await User.getDomainsWithPrivilege(privilege, category, user)
|
61
58
|
}
|
62
59
|
|
63
60
|
@FieldResolver(type => String)
|
@@ -76,6 +73,11 @@ export class PrivilegeQuery {
|
|
76
73
|
})
|
77
74
|
}
|
78
75
|
|
76
|
+
@FieldResolver(type => String)
|
77
|
+
async privilege(@Root() privilege: Privilege, @Ctx() context: ResolverContext) {
|
78
|
+
return privilege.name
|
79
|
+
}
|
80
|
+
|
79
81
|
@FieldResolver(type => [Role])
|
80
82
|
async roles(@Root() privilege: Privilege) {
|
81
83
|
return (
|
@@ -27,9 +27,6 @@ export class PrivilegeObject {
|
|
27
27
|
|
28
28
|
@Field({ nullable: true })
|
29
29
|
super?: boolean
|
30
|
-
|
31
|
-
@Field({ nullable: true })
|
32
|
-
protected?: boolean
|
33
30
|
}
|
34
31
|
|
35
32
|
@InputType()
|
@@ -45,9 +42,6 @@ export class PrivilegeInput {
|
|
45
42
|
|
46
43
|
@Field({ nullable: true })
|
47
44
|
super?: boolean
|
48
|
-
|
49
|
-
@Field({ nullable: true })
|
50
|
-
protected?: boolean
|
51
45
|
}
|
52
46
|
|
53
47
|
@Entity()
|
@@ -312,12 +312,12 @@ export class User {
|
|
312
312
|
}
|
313
313
|
}
|
314
314
|
|
315
|
-
static async hasPrivilege(
|
315
|
+
static async hasPrivilege(privilege: string, category: string, domain: Domain, user: User) {
|
316
316
|
const result = await getRepository(User).query(
|
317
317
|
`
|
318
318
|
SELECT COUNT(1) AS "has_privilege" FROM "privileges" "PRIVILEGES"
|
319
319
|
WHERE "PRIVILEGES"."category" = '${category}'
|
320
|
-
AND "PRIVILEGES"."name" = '${
|
320
|
+
AND "PRIVILEGES"."name" = '${privilege}'
|
321
321
|
AND "PRIVILEGES"."id" IN (
|
322
322
|
SELECT "RP"."privileges_id"
|
323
323
|
FROM "users_roles" "UR"
|
@@ -334,7 +334,7 @@ export class User {
|
|
334
334
|
|
335
335
|
static async getPrivilegesByDomain(user: User, domain: Domain) {
|
336
336
|
const result = await getRepository(User).query(`
|
337
|
-
SELECT name, category FROM "privileges" "PRIVILEGES"
|
337
|
+
SELECT name privilege, category FROM "privileges" "PRIVILEGES"
|
338
338
|
WHERE "PRIVILEGES"."id" IN (
|
339
339
|
SELECT "RP"."privileges_id"
|
340
340
|
FROM "users_roles" "UR"
|
@@ -347,7 +347,7 @@ export class User {
|
|
347
347
|
return result
|
348
348
|
}
|
349
349
|
|
350
|
-
static async getDomainsWithPrivilege(
|
351
|
-
return getDomainsWithPrivilege(user,
|
350
|
+
static async getDomainsWithPrivilege(privilege: string, category: string, user: User) {
|
351
|
+
return getDomainsWithPrivilege(user, privilege, category)
|
352
352
|
}
|
353
353
|
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import { Domain } from '@things-factory/shell'
|
2
|
+
import { PrivilegeObject } from '../service/privilege/privilege'
|
3
|
+
import { User } from '../service/user/user'
|
4
|
+
|
5
|
+
export async function checkPermission(
|
6
|
+
privilegeObject: PrivilegeObject,
|
7
|
+
user: User,
|
8
|
+
domain: Domain,
|
9
|
+
unsafeIP?: boolean,
|
10
|
+
prohibitedPrivileges?: { category: string; privilege: string }[]
|
11
|
+
): Promise<boolean> {
|
12
|
+
if (!privilegeObject) {
|
13
|
+
return true
|
14
|
+
}
|
15
|
+
|
16
|
+
const { owner: domainOwnerGranted, super: superUserGranted, category, privilege } = privilegeObject
|
17
|
+
|
18
|
+
if (unsafeIP) {
|
19
|
+
if (privilege && category) {
|
20
|
+
// unsafeIP 상황에서는 ownership granted는 적용되지 않는다.
|
21
|
+
if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
|
22
|
+
return false
|
23
|
+
}
|
24
|
+
|
25
|
+
return await User.hasPrivilege(privilege, category, domain, user)
|
26
|
+
}
|
27
|
+
|
28
|
+
// privilege, category가 설정되지 않은 경우에는 ownership granted가 설정되었다면 허가하지 않는다.
|
29
|
+
return !domainOwnerGranted && !superUserGranted
|
30
|
+
} else {
|
31
|
+
if (!privilege || !category) {
|
32
|
+
// privilege, category가 설정되지 않은 경우에는 ownership granted만을 적용한다.
|
33
|
+
return (
|
34
|
+
(domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
|
35
|
+
(superUserGranted && (await process.superUserGranted(domain, user)))
|
36
|
+
)
|
37
|
+
}
|
38
|
+
|
39
|
+
if (
|
40
|
+
(domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
|
41
|
+
(superUserGranted && (await process.superUserGranted(domain, user)))
|
42
|
+
) {
|
43
|
+
return true
|
44
|
+
}
|
45
|
+
|
46
|
+
if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
|
47
|
+
return false
|
48
|
+
}
|
49
|
+
|
50
|
+
return await User.hasPrivilege(privilege, category, domain, user)
|
51
|
+
}
|
52
|
+
}
|