完善权限认证功能

This commit is contained in:
2020-11-02 00:04:27 +08:00
parent e09d2db2b8
commit 27a070cb36
17 changed files with 151 additions and 41 deletions

View File

@@ -1,11 +1,14 @@
package com.synebula.zeus.app.controller.rbac.resource package com.synebula.zeus.app.controller.rbac.resource
import com.synebula.gaea.app.Application import com.synebula.gaea.app.Application
import com.synebula.gaea.app.component.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.zeus.domain.service.cmd.rbac.resource.InterfaceCmd import com.synebula.zeus.domain.service.cmd.rbac.resource.InterfaceCmd
import com.synebula.zeus.domain.service.contr.rbac.resource.IInterfaceService import com.synebula.zeus.domain.service.contr.rbac.resource.IInterfaceService
import com.synebula.zeus.query.impl.resouce.InterfaceQuery import com.synebula.zeus.query.contr.resouce.IInterfaceQuery
import com.synebula.zeus.query.view.resource.InterfaceView import com.synebula.zeus.query.view.resource.InterfaceView
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@@ -13,9 +16,31 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/interfaces") @RequestMapping("/interfaces")
class InterfaceApp( class InterfaceApp(
service: IInterfaceService, service: IInterfaceService,
query: InterfaceQuery, logger: ILogger,
logger: ILogger var interfaceQuery: IInterfaceQuery
) : Application<InterfaceCmd, InterfaceView, String>( ) : Application<InterfaceCmd, InterfaceView, String>(
"接口信息", InterfaceView::class.java, "接口信息", InterfaceView::class.java,
service, query, logger service, interfaceQuery, logger
) ) {
@GetMapping("/in-system/{system}/permission/{role}")
fun withSystemPermission(@PathVariable system: String, @PathVariable role: String): HttpMessage {
return this.safeExecute("获取有权资源列表失败") { msg ->
msg.data = this.interfaceQuery.withPermission(role, system)
}
}
@GetMapping("/permission/{role}")
fun withPermission(@PathVariable role: String): HttpMessage {
return this.safeExecute("获取有权资源列表失败") { msg ->
msg.data = this.interfaceQuery.withPermission(role)
}
}
@GetMapping("/{api}/authentication/{role}")
fun authentication(@PathVariable api: String, @PathVariable role: String): HttpMessage {
return this.safeExecute("获取权限信息失败") { msg ->
msg.data = this.interfaceQuery.authentication(api, role)
}
}
}

View File

@@ -1,11 +1,14 @@
package com.synebula.zeus.app.controller.rbac.resource package com.synebula.zeus.app.controller.rbac.resource
import com.synebula.gaea.app.Application import com.synebula.gaea.app.Application
import com.synebula.gaea.app.component.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.zeus.domain.service.cmd.rbac.resource.PageCmd import com.synebula.zeus.domain.service.cmd.rbac.resource.PageCmd
import com.synebula.zeus.domain.service.contr.rbac.resource.IPageService import com.synebula.zeus.domain.service.contr.rbac.resource.IPageService
import com.synebula.zeus.query.contr.resouce.IPageQuery import com.synebula.zeus.query.contr.resouce.IPageQuery
import com.synebula.zeus.query.view.resource.PageView import com.synebula.zeus.query.view.resource.PageView
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@@ -13,9 +16,31 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/pages") @RequestMapping("/pages")
class PageApp( class PageApp(
service: IPageService, service: IPageService,
query: IPageQuery, logger: ILogger,
logger: ILogger var pageQuery: IPageQuery
) : Application<PageCmd, PageView, String>( ) : Application<PageCmd, PageView, String>(
"页面信息", PageView::class.java, "页面信息", PageView::class.java,
service, query, logger service, pageQuery, logger
) ) {
@GetMapping("/in-system/{system}/permission/{role}")
fun withSystemPermission(@PathVariable system: String, @PathVariable role: String): HttpMessage {
return this.safeExecute("获取有权资源列表失败") { msg ->
msg.data = this.pageQuery.withPermission(role, system)
}
}
@GetMapping("/permission/{role}")
fun withPermission(@PathVariable role: String): HttpMessage {
return this.safeExecute("获取有权资源列表失败") { msg ->
msg.data = this.pageQuery.withPermission(role)
}
}
@GetMapping("/{page}/authentication/{role}")
fun authentication(@PathVariable page: String, @PathVariable role: String): HttpMessage {
return this.safeExecute("获取权限信息失败") { msg ->
msg.data = this.pageQuery.authentication(page, role)
}
}
}

View File

@@ -1,11 +1,14 @@
package com.synebula.zeus.app.controller.rbac.resource package com.synebula.zeus.app.controller.rbac.resource
import com.synebula.gaea.app.Application import com.synebula.gaea.app.Application
import com.synebula.gaea.app.component.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.zeus.domain.service.cmd.rbac.resource.SystemCmd import com.synebula.zeus.domain.service.cmd.rbac.resource.SystemCmd
import com.synebula.zeus.domain.service.contr.rbac.resource.ISystemService import com.synebula.zeus.domain.service.contr.rbac.resource.ISystemService
import com.synebula.zeus.query.contr.resouce.ISystemQuery import com.synebula.zeus.query.contr.resouce.ISystemQuery
import com.synebula.zeus.query.view.resource.SystemView import com.synebula.zeus.query.view.resource.SystemView
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@@ -13,9 +16,23 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/systems") @RequestMapping("/systems")
class SystemApp( class SystemApp(
service: ISystemService, service: ISystemService,
query: ISystemQuery, logger: ILogger,
logger: ILogger var systemQuery: ISystemQuery
) : Application<SystemCmd, SystemView, String>( ) : Application<SystemCmd, SystemView, String>(
"系统信息", SystemView::class.java, "系统信息", SystemView::class.java,
service, query, logger service, systemQuery, logger
) ) {
@GetMapping("/permission/{role}")
fun withPermission(@PathVariable role: String): HttpMessage {
return this.safeExecute("获取有权资源列表失败") { msg ->
msg.data = this.systemQuery.withPermission(role)
}
}
@GetMapping("/{system}/authentication/{role}")
fun authentication(@PathVariable system: String, @PathVariable role: String): HttpMessage {
return this.safeExecute("获取权限信息失败") { msg ->
msg.data = this.systemQuery.authentication(system, role)
}
}
}

View File

@@ -3,5 +3,6 @@ package com.synebula.zeus.domain.model.rbac.resource
import com.synebula.gaea.domain.model.IAggregateRoot import com.synebula.gaea.domain.model.IAggregateRoot
class Interface : Resource(), IAggregateRoot<String> { class Interface : Resource(), IAggregateRoot<String> {
var system = ""
override var alive = true override var alive = true
} }

View File

@@ -5,16 +5,16 @@ import com.synebula.gaea.domain.model.IAggregateRoot
class Page : Resource(), IAggregateRoot<String> { class Page : Resource(), IAggregateRoot<String> {
// 上级页面 // 上级页面
val supPage = 0 var parent = ""
// 页面图标 // 页面图标
val icon: String? = null var icon: String? = null
// 附加参数 // 附加参数
val params: String? = null var params: String? = null
// 所属系统 // 所属系统
val system = 0 var system = ""
override var alive = true override var alive = true

View File

@@ -4,8 +4,8 @@ import com.synebula.gaea.domain.model.Entity
abstract class Resource(override var id: String? = null) : Entity<String>() { abstract class Resource(override var id: String? = null) : Entity<String>() {
var name = "" var name = ""
var signature = "" //资源定位符唯一标识。可以是uil也可以是别名
val uri: String? = null var uri = ""
var order = 0 var order = 0
var desc = "" var desc: String? = null
} }

View File

@@ -1,5 +1,6 @@
package com.synebula.zeus.domain.service.cmd.rbac.resource package com.synebula.zeus.domain.service.cmd.rbac.resource
class InterfaceCmd : ResourceCmd() { class InterfaceCmd : ResourceCmd() {
var system = ""
var alive = true var alive = true
} }

View File

@@ -3,16 +3,16 @@ package com.synebula.zeus.domain.service.cmd.rbac.resource
class PageCmd : ResourceCmd() { class PageCmd : ResourceCmd() {
// 上级页面 // 上级页面
val supPage = 0 var parent = ""
// 页面图标 // 页面图标
val icon: String? = null var icon: String? = null
// 附加参数 // 附加参数
val params: String? = null var params: String? = null
// 所属系统 // 所属系统
val system = 0 var system = ""
var alive = true var alive = true

View File

@@ -5,8 +5,8 @@ import com.synebula.gaea.domain.service.Command
abstract class ResourceCmd(var id: String? = null) : Command() { abstract class ResourceCmd(var id: String? = null) : Command() {
var name = "" var name = ""
var signature = "" //资源定位符唯一标识。可以是uil也可以是别名
val uri: String? = null var uri = ""
var order = 0 var order = 0
var desc = "" var desc: String? = null
} }

View File

@@ -8,5 +8,7 @@ interface IInterfaceQuery : IQuery {
fun withPermission(role: String): List<InterfaceView> fun withPermission(role: String): List<InterfaceView>
fun withPermission(role: String, system: String?): List<InterfaceView>
fun authentication(resource: String, role: String): PermissionType fun authentication(resource: String, role: String): PermissionType
} }

View File

@@ -8,5 +8,7 @@ interface IPageQuery : IQuery {
fun withPermission(role: String): List<PageView> fun withPermission(role: String): List<PageView>
fun withPermission(role: String, system: String? ): List<PageView>
fun authentication(resource: String, role: String): PermissionType fun authentication(resource: String, role: String): PermissionType
} }

View File

@@ -4,17 +4,36 @@ import com.synebula.gaea.mongo.query.MongoQuery
import com.synebula.zeus.env.PermissionType import com.synebula.zeus.env.PermissionType
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.contr.resouce.IInterfaceQuery import com.synebula.zeus.query.contr.resouce.IInterfaceQuery
import com.synebula.zeus.query.contr.resouce.IPermissionQuery
import com.synebula.zeus.query.contr.resouce.ISystemQuery
import com.synebula.zeus.query.view.resource.InterfaceView import com.synebula.zeus.query.view.resource.InterfaceView
import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.MongoTemplate
class InterfaceQuery(template: MongoTemplate, var permissionQuery: PermissionQuery) : MongoQuery(template), IInterfaceQuery { class InterfaceQuery(template: MongoTemplate, var permissionQuery: IPermissionQuery, var systemQuery: ISystemQuery) :
MongoQuery(template),
IInterfaceQuery {
private val clazz = InterfaceView::class.java private val clazz = InterfaceView::class.java
override fun withPermission(role: String): List<InterfaceView> { override fun withPermission(role: String): List<InterfaceView> {
val interfaces = this.list(mapOf(), this.clazz) return this.withPermission(role, null)
}
override fun withPermission(role: String, system: String?): List<InterfaceView> {
if (system != null) {
val permission = this.systemQuery.authentication(system, role)
if (permission == PermissionType.Deny)
return listOf()
}
val params = mutableMapOf<String, Any>()
if (system != null) params["system"] = system
val interfaces = this.list(params, this.clazz)
val permissions = this.permissionQuery.resourcePermissions(ResourceType.Interface, role) val permissions = this.permissionQuery.resourcePermissions(ResourceType.Interface, role)
return interfaces.filter { i -> permissions.find { p -> i.id == p.resource }?.authorization == PermissionType.Allow } return interfaces.filter { i ->
val permission = permissions.find { p -> i.id == p.resource }
permission == null || permission.authorization == PermissionType.Allow
}
} }
override fun authentication(resource: String, role: String): PermissionType { override fun authentication(resource: String, role: String): PermissionType {

View File

@@ -4,16 +4,33 @@ import com.synebula.gaea.mongo.query.MongoQuery
import com.synebula.zeus.env.PermissionType import com.synebula.zeus.env.PermissionType
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.contr.resouce.IPageQuery import com.synebula.zeus.query.contr.resouce.IPageQuery
import com.synebula.zeus.query.contr.resouce.IPermissionQuery
import com.synebula.zeus.query.contr.resouce.ISystemQuery
import com.synebula.zeus.query.view.resource.PageView import com.synebula.zeus.query.view.resource.PageView
import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.MongoTemplate
class PageQuery(template: MongoTemplate, var permissionQuery: PermissionQuery) : MongoQuery(template), IPageQuery { class PageQuery(template: MongoTemplate, var permissionQuery: IPermissionQuery, var systemQuery: ISystemQuery) :
MongoQuery(template), IPageQuery {
private val clazz = PageView::class.java private val clazz = PageView::class.java
override fun withPermission(role: String): List<PageView> { override fun withPermission(role: String): List<PageView> {
val pages = this.list(mapOf(), this.clazz) return this.withPermission(role, null)
}
override fun withPermission(role: String, system: String?): List<PageView> {
if (system != null) {
val permission = this.systemQuery.authentication(system, role)
if (permission == PermissionType.Deny)
return listOf()
}
val params = mutableMapOf<String, Any>()
if (system != null) params["system"] = system
val pages = this.list(params, this.clazz)
val permissions = this.permissionQuery.resourcePermissions(ResourceType.Page, role) val permissions = this.permissionQuery.resourcePermissions(ResourceType.Page, role)
return pages.filter { i -> permissions.find { p -> i.id == p.resource }?.authorization == PermissionType.Allow } return pages.filter { i ->
val permission = permissions.find { p -> i.id == p.resource }
permission == null || permission.authorization == PermissionType.Allow
}
} }
override fun authentication(resource: String, role: String): PermissionType { override fun authentication(resource: String, role: String): PermissionType {

View File

@@ -16,7 +16,7 @@ class PermissionQuery(template: MongoTemplate) : MongoQuery(template), IPermissi
override fun resourcePermissions(resourceType: ResourceType, role: String): List<PermissionView> { override fun resourcePermissions(resourceType: ResourceType, role: String): List<PermissionView> {
return this.template.find( return this.template.find(
Query.query( Query.query(
Criteria.where("resourceType").`is`(resourceType) Criteria.where("type").`is`(resourceType)
.and("role").`is`(role) .and("role").`is`(role)
), this.clazz, this.collection) ), this.clazz, this.collection)
} }

View File

@@ -1,5 +1,6 @@
package com.synebula.zeus.query.view.resource package com.synebula.zeus.query.view.resource
class InterfaceView : ResourceView() { class InterfaceView : ResourceView() {
var system = ""
var alive = true var alive = true
} }

View File

@@ -3,16 +3,16 @@ package com.synebula.zeus.query.view.resource
class PageView : ResourceView() { class PageView : ResourceView() {
// 上级页面 // 上级页面
val supPage = 0 var parent = ""
// 页面图标 // 页面图标
val icon: String? = null var icon: String? = null
// 附加参数 // 附加参数
val params: String? = null var params: String? = null
// 所属系统 // 所属系统
val system = 0 var system = ""
var alive = true var alive = true

View File

@@ -3,8 +3,8 @@ package com.synebula.zeus.query.view.resource
abstract class ResourceView(var id: String? = null) { abstract class ResourceView(var id: String? = null) {
var name = "" var name = ""
var signature = "" //资源定位符唯一标识。可以是uil也可以是别名
val uri: String? = null var uri = ""
var order = 0 var order = 0
var desc = "" var desc: String? = null
} }