@jojoxd/tsed-auth-expression
v1.0.0
Published
Add scripting to your authorization
Downloads
5
Readme
@jojoxd/tsed-auth-expression
Use Jexl expressions for authorization.
Installation
You can get the latest release and the type definitions using npm:
$ npm install @jojoxd/tsed-auth-expression
// Server.ts
import "@jojoxd/tsed-auth-expression";
// <snip>
@Configuration({
// No configuration required (yet)
})
export class Server {}
Examples
Creating a Context Provider
The Auth Context Provider provides variables you can use in your expressions. It has access to the container using @Inject()
, and has access to the Ts.ED Context.
import { AuthExpressionContextProvider, AuthExpressionContextProviderMethods } from "@jojoxd/tsed-auth-expression";
import { Context } from "@tsed/common";
@AuthExpressionContextProvider()
export class MyAuthContextProvider implements AuthExpressionContextProviderMethods
{
async getContext(context: Context): Promise<any>
{
return {
variable: 'Hello, World!'
};
}
}
Using Expressions
Expressions manage authorization. For example, you could have an AuthContextProvider that provides the current user as a variable, and check if user.isAdmin
is true
.
Here, we use the above AuthContextProvider to check if variable
is "Hello, World!"
:
import { Controller } from "@tsed/di";
import { Get } from "@tsed/schema";
import { UseAuthExpression } from "@jojoxd/tsed-auth-expression";
@Controller('/')
export class MyController
{
@Get('/hello-world')
@UseAuthExpression('variable == "Hello, World!"')
getHelloWorld() {
return { message: 'Hello, World!', };
}
}
Jexl Extensions
To extend Jexl yourself, you can use OverrideProvider for AuthExpressionMiddleware
:
import { OverrideProvider } from "@tsed/di";
import { AuthExpressionMiddleware } from "@jojoxd/tsed-auth-expression";
@OverrideProvider(AuthExpressionMiddleware)
export class MyAuthExpressionMiddleware extends AuthExpressionMiddleware
{
constructor()
{
super();
// now you can use this.expressionEvaluator to access Jexl
}
}
Exists
We've added an extra function exists
. This can be used to check if a variable exists. (Seems logical to me.)
Usage:
import { Controller } from "@tsed/di";
import { Get } from "@tsed/schema";
import { UseAuth } from "@jojoxd/tsed-auth-expression";
@Controller('/')
export class MyController
{
@Get('/')
@UseAuth('currentUser|exists && currentUser.isAdmin')
getTest() {}
}
Pre-defined variables
explain pre-defined variables (QueryParams, PathParams, Request, etc.)
There are a couple of pre-defined variables available:
routeParams
: contains the Path ParametersqueryParams
: contains the Query Parameterssession
: contains the Session instance.cookies
: contains cookies from the requestrequest
: contains the full Ts.ED PlatformRequest object.
Example with Path and Query Params:
import { Controller } from "@tsed/di";
import { Get } from "@tsed/schema";
import { UseAuthExpression } from "@jojoxd/tsed-auth-expression";
@Controller('/')
export class MyController
{
@Get('/:myPathParam')
@UseAuthExpression('routeParams.myPathParam == 1 && queryParams.hello|exists')
getMyPathParam() {}
}
Some considerations
Note that we are deviating a bit from the standard Jexl expression language, as we have disabled assignment to not get any pollution.
Roadmap:
Things I'd like to have:
- Allow grouping providers (Will save on resources)
- Allow easier Jexl extension (Better DX)
- Allow deferring getters for variables (Will save on resources)