Skip to content

Commit 93cd0be

Browse files
committed
feat(authorization): easier to understand UI for permission management
Each resource has now a separate page which can be used in links for integration into other UIs.
1 parent 01bdd2b commit 93cd0be

File tree

7 files changed

+357
-234
lines changed

7 files changed

+357
-234
lines changed

authorization/src/main/kotlin/org/modelix/authorization/AuthorizationPlugin.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ import io.ktor.server.application.ApplicationCallPipeline
1515
import io.ktor.server.application.BaseRouteScopedPlugin
1616
import io.ktor.server.application.call
1717
import io.ktor.server.application.install
18+
import io.ktor.server.application.plugin
1819
import io.ktor.server.auth.Authentication
1920
import io.ktor.server.auth.AuthenticationContext
2021
import io.ktor.server.auth.AuthenticationProvider
2122
import io.ktor.server.auth.authenticate
2223
import io.ktor.server.auth.jwt.jwt
2324
import io.ktor.server.auth.principal
24-
import io.ktor.server.html.respondHtml
2525
import io.ktor.server.plugins.forwardedheaders.XForwardedHeaders
2626
import io.ktor.server.plugins.statuspages.StatusPages
2727
import io.ktor.server.response.respond
@@ -31,11 +31,15 @@ import io.ktor.server.routing.application
3131
import io.ktor.server.routing.get
3232
import io.ktor.server.routing.routing
3333
import io.ktor.util.AttributeKey
34+
import kotlinx.coroutines.Dispatchers
35+
import kotlinx.coroutines.launch
3436
import org.modelix.authorization.permissions.PermissionEvaluator
3537
import org.modelix.authorization.permissions.PermissionInstanceReference
3638
import org.modelix.authorization.permissions.PermissionParser
3739
import org.modelix.authorization.permissions.PermissionParts
3840
import org.modelix.authorization.permissions.SchemaInstance
41+
import org.modelix.authorization.permissions.recordKnownRoles
42+
import org.modelix.authorization.permissions.recordKnownUser
3943
import java.nio.charset.StandardCharsets
4044
import java.util.Base64
4145
import java.util.Collections
@@ -85,7 +89,18 @@ object ModelixAuthorization : BaseRouteScopedPlugin<IModelixAuthorizationConfig,
8589
}
8690
validate {
8791
try {
88-
jwtFromHeaders()?.let(::AccessTokenPrincipal)
92+
val authPlugin = application.plugin(ModelixAuthorization)
93+
val authConfig = authPlugin.config
94+
jwtFromHeaders()
95+
?.let { authConfig.nullIfInvalid(it) }
96+
?.also { jwt ->
97+
application.launch(Dispatchers.IO) {
98+
val accessControlPersistence = authConfig.accessControlPersistence
99+
accessControlPersistence.recordKnownUser(authConfig.jwtUtil.extractUserId(jwt))
100+
accessControlPersistence.recordKnownRoles(authConfig.jwtUtil.extractUserRoles(jwt))
101+
}
102+
}
103+
?.let(::AccessTokenPrincipal)
89104
} catch (e: Exception) {
90105
LOG.warn(e) { "Failed to read JWT token" }
91106
null
@@ -146,11 +161,6 @@ object ModelixAuthorization : BaseRouteScopedPlugin<IModelixAuthorizationConfig,
146161
)
147162
}
148163
}
149-
get("permissions") {
150-
call.respondHtml {
151-
buildPermissionPage(call.getPermissionEvaluator())
152-
}
153-
}
154164
}
155165
if (config.permissionManagementEnabled) {
156166
installPermissionManagementHandlers()

0 commit comments

Comments
 (0)