1.2.1 • Published 7 months ago

adminjs-adonis-auth v1.2.1

Weekly downloads
-
License
MIT
Repository
github
Last release
7 months ago

I wil delete this when real dev merge this commit

The only difference between this and adminjs-adonis is authentication

Admin Js Adonis

Adapter & Plugin package to use AdminJS with AdonisJS.

Getting Started

Installation

# using npm:

npm install --save adminjs-adonis-auth adminjs@^6.0.0

# or using yarn:
yarn add adminjs-adonis-auth adminjs@^6.0.0

After this, run:

node ace configure adminjs-adonis-auth

Configuration

The configuration for this package resides in config/adminjs.ts. Checkout templates/config.txt for configuration options.

Model Customization

This package aims to auto-detect correct types of most of model columns but there are still some cases where it fails (for example: Enums, Attachments, nullable types etc) due to limitations of reflect-metadata package.

For this purpose, there is a @adminColumn decorator which you can use to inform the adapter how exactly you want a particular column to be displayed (or not displayed at all).

// User.ts
import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
import { adminColumn } from '@ioc:Adonis/Addons/AdminJS'

export enum UserType {
    STUDENT = 1,
    TEACHER = 2,
}

export class User extends BaseModel {
    @column({ isPrimary: true })
    public id: number

    @column()
    public username: string

    @column()
    @adminColumn({
        // password won't be visible on the list or show page
        visible: false
    })
    public password: string

    @column()
    @adminColumn({
        enum: UserType 
        // type will now be rendered as a select box
        // and will display the choices as text rather than numbers
    })
    public type: UserType

    @column()
    @adminColumn({
        // By default, `number | null` type is parsed as string
        type: "number",
        // By default, every field is required except the primary key
        optional: true,
    })
    public teachingNumber: number | null
}

For full options provided by adminColumn decorator, visit here

Hooks

This package also provides hooks for lifecycle management. These hooks are:

  • beforeCreate
  • beforeUpdate
  • beforeDelete
  • beforeFind
  • beforeFetch
  • afterCreate
  • afterUpdate
  • afterDelete
  • afterFind
  • afterFetch

They work the same as AdonisJS' hooks and when these hooks are called, corresponding AdonisJS hooks are also executed. For example: when user is creating a new object, then the order of hooks is: 1. beforeCreate (of admin) 2. beforeCreate (of AdonisJS) 3. beforeSave (of AdonisJS) 4. afterCreate (of AdonisJS) 5. afterSave (of AdonisJS) 6. afterCreate (of admin)

Note: There is no beforeSave or afterSave hook in this package

Example:

// User.ts
import { beforeCreate, beforeUpdate } from '@ioc:Adonis/Addons/AdminJS'
import Hash from '@ioc:Adonis/Core/Hash'
import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'

export class User extends BaseModel {
    @column({ isPrimary: true })
    public id: number

    @column()
    public username: string

    @column()
    public password: string

    @beforeCreate()
    @beforeUpdate()
    public static async setPasswordIfDirty(instance: User) {
        if (instance.$dirty.password) {
            instance.password = await Hash.make(instance.password)
        }
    }
}

Authentication

Authentication comes enabled by default

You can change the auth method on config

Model based authentication

authenticate: async (email, password) => {
    const {default:User} = await import('App/Models/User')
    const {default:Hash} = await import("@ioc:Adonis/Core/Hash")
    const user = await User.findBy("email", email)

    if (!user){
        return null
    }
    const isPasswordOk = await Hash.verify(user.password, password)
    if (!isPasswordOk){
        return null
    }
    if (!user.isAdmin){
        return null
    }
    return user
}

Env based authentication

authenticate: (email, password) => {
    if (
        email == Env.get("ADMIN_EMAIL") 
        && 
        password == Env.get("ADMIN_PASSWORD")
    ){
        return {email, password}
    }
    return null
}

Other config variables

auth: {
    /**
     * Authentication enabled/disabled flag.
     * When set to true, the authentication is enabled. When set to false, it's disabled.
    */
    enabled: true,

    /**
     * Maximum number of login retries allowed.
     * The user is locked out after exceeding this limit.
     */
    maxRetries: 5,

    /**
     * Duration (in seconds) for which a user is locked out after exceeding the max retries.
     */
    duration: 60,

    /**
     * Optional login path for authentication.
     * If not provided, a default path is used.
     */
    loginPath: "/admin/login",

    /**
     * Optional logout path for authentication.
     * If not provided, a default path is used.
     */
    logoutPath: "/admin/logout",

    /**
     * Function for authenticating a user.
     * This function takes an email and password as parameters and returns
     * a user object if authentication is successful or null if it fails.
     *
     * @param email - The user's email address for authentication.
     * @param password - The user's password for authentication.
     * @returns A user object if authentication is successful, or null if it fails.
     */
    authenticate: (email, password) => {
        if (email == "admin@admin.com" && password == "admin12345") {
            return { email, password }
        }
        return null
    }

}
1.2.1

7 months ago

1.2.0

7 months ago