2 Commits
0.1.0 ... 0.1.1

Author SHA1 Message Date
1fe063add2 Rename to AccessKontrol 2021-07-14 04:12:37 +02:00
642bfb875e Add documentation 2021-07-14 04:00:51 +02:00
6 changed files with 62 additions and 22 deletions

View File

@@ -1,8 +1,48 @@
# access-control
Helpers to create Access Control
# Access Kontrol
Helpers to create a simple Access Control in kotlin
[![Tests](https://github.com/flecomte/access-control/actions/workflows/tests.yml/badge.svg)](https://github.com/flecomte/access-control/actions/workflows/tests.yml)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=flecomte_access-control&metric=coverage)](https://sonarcloud.io/dashboard?id=flecomte_access-control)
[![Tests](https://github.com/flecomte/access-kontrol/actions/workflows/tests.yml/badge.svg)](https://github.com/flecomte/access-kontrol/actions/workflows/tests.yml)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=flecomte_access-kontrol&metric=coverage)](https://sonarcloud.io/dashboard?id=flecomte_access-kontrol)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=flecomte_access-control&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=flecomte_access-control)
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=flecomte_access-control&metric=ncloc)](https://sonarcloud.io/dashboard?id=flecomte_access-control)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=flecomte_access-kontrol&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=flecomte_access-kontrol)
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=flecomte_access-kontrol&metric=ncloc)](https://sonarcloud.io/dashboard?id=flecomte_access-kontrol)
## Example
Define AC
```kotlin
class AccessControlSample : AccessKontrol() {
/** The user can view the object if it is connected and if it is the creator */
fun canView(myObject: MyObject, user: User?): AccessResponse {
return if (user != null && myObject.createdBy == user) {
granted(message = "OK") // the message if optional on granted
} else {
denied(message = "You must be the creator", code = "creator.ko")
}
}
fun canView(myObjects: List<MyObject>, user: User?): AccessResponses {
return canAll(myObjects) { canView(it, user) }
}
}
```
Usage
```kotlin
AccessControlSample().canView(MyObject(), User()).let { response ->
response.message // "OK"
response.decision == AccessDecision.GRANTED // true
}
try {
AccessControlSample().canView(MyObject(), User()).assert() // throw exception if no access
} catch (e: AccessDeniedException) {
e.getFirstMessage() // the access denied message: "You must be the creator"
e.first.code // the access denied code: "creator.ko"
}
AccessControlSample().canView(MyObject(), User()).toBoolean() // return true if access is granted
```

View File

@@ -44,8 +44,8 @@ val sourcesJar by tasks.registering(Jar::class) {
publishing {
repositories {
maven {
name = "access-control"
url = uri("https://maven.pkg.github.com/flecomte/access-control")
name = "access-kontrol"
url = uri("https://maven.pkg.github.com/flecomte/access-kontrol")
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
@@ -54,7 +54,7 @@ publishing {
}
publications {
create<MavenPublication>("access-control") {
create<MavenPublication>("access-kontrol") {
from(components["java"])
artifact(sourcesJar)
}

View File

@@ -1,7 +1,7 @@
kotlin.code.style=official
systemProp.sonar.host.url=https://sonarcloud.io
systemProp.sonar.projectKey=flecomte_access-control
systemProp.sonar.projectName=AccessControl
systemProp.sonar.projectKey=flecomte_access-kontrol
systemProp.sonar.projectName=AccessKontrol
systemProp.sonar.organization=flecomte
systemProp.sonar.java.coveragePlugin=jacoco
systemProp.sonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/test/jacocoTestReport.xml

View File

@@ -1 +1 @@
rootProject.name = "access-control"
rootProject.name = "access-kontrol"

View File

@@ -1,6 +1,6 @@
package io.github.flecomte
/** Responses of AccessControl */
/** Responses of AccessKontrol */
enum class AccessDecision {
GRANTED,
DENIED;
@@ -14,7 +14,7 @@ enum class AccessDecision {
}
}
abstract class AccessControl {
abstract class AccessKontrol {
/**
* A Shortcut for return a GrantedResponse
*/
@@ -39,9 +39,9 @@ abstract class AccessControl {
}
/**
* Throw an Exception if AccessControl return a DENIED response
* Throw an Exception if AccessKontrol return a DENIED response
*/
fun <T : AccessControl> T.assert(action: T.() -> AccessResponse) {
fun <T : AccessKontrol> T.assert(action: T.() -> AccessResponse) {
action().assert()
}
@@ -109,13 +109,13 @@ class AccessDeniedException(val accessResponses: AccessResponses) : Throwable(ac
}
/**
* The response that all AccessControl method return
* The response that all AccessKontrol method return
* @see GrantedResponse
* @see DeniedResponse
*/
sealed class AccessResponse(
val decision: AccessDecision,
val accessControl: AccessControl,
val accessControl: AccessKontrol,
val message: String?,
val code: String?
) {
@@ -135,13 +135,13 @@ sealed class AccessResponse(
}
open class GrantedResponse(
accessControl: AccessControl,
accessControl: AccessKontrol,
message: String? = null,
code: String? = null
) : AccessResponse(AccessDecision.GRANTED, accessControl, message, code)
open class DeniedResponse(
accessControl: AccessControl,
accessControl: AccessKontrol,
message: String,
code: String
) : AccessResponse(AccessDecision.DENIED, accessControl, message, code)

View File

@@ -13,7 +13,7 @@ data class MyObject(
val title: String
)
class AccessControlSample : AccessControl() {
class AccessControlSample : AccessKontrol() {
fun canView(myObject: MyObject, user: User?): AccessResponse {
return if (myObject.title == "granted" && user != null) {
granted("ok")
@@ -29,7 +29,7 @@ class AccessControlSample : AccessControl() {
}
}
class AccessControlTest {
class AccessKontrolTest {
@Test
fun `test granted`() {
AccessControlSample().run {