Skip to content
Snippets Groups Projects
Unverified Commit f89e3662 authored by Thomas SAUVAGE's avatar Thomas SAUVAGE
Browse files

Working !

parent 84ba8be7
No related branches found
No related tags found
1 merge request!4Trying to implement openid
Pipeline #13835 passed
import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import NotSigmaUser from 'App/Models/NotSigmaUser' import User from 'App/Models/User'
import { randomString } from 'App/Utils/random' import { randomString } from 'App/Utils/random'
/** Login a user that is not using the CAS */ /** Login a user that is not using the CAS */
...@@ -24,13 +24,13 @@ export const createNotSigmaUser = async ({ request, response }: HttpContextContr ...@@ -24,13 +24,13 @@ export const createNotSigmaUser = async ({ request, response }: HttpContextContr
const password = randomString(20) const password = randomString(20)
// Check if user already exists // Check if user already exists
const user = await NotSigmaUser.findBy('username', username) const user = await User.findBy('username', username)
if (user) { if (user) {
return response.badRequest({ error: 'User already exists' }) return response.badRequest({ error: 'User already exists' })
} }
await NotSigmaUser.create({ username, password }) await User.create({ username, password })
return response.created({ message: 'User created', username, password }) return response.created({ message: 'User created', username, password })
} }
......
import Env from '@ioc:Adonis/Core/Env' import Env from '@ioc:Adonis/Core/Env'
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import NotSigmaUser from 'App/Models/NotSigmaUser' import User from 'App/Models/User'
import { ClientMetadata, Issuer, generators } from 'openid-client' import { ClientMetadata, Issuer, generators } from 'openid-client'
const AUTH_URL = 'https://auth.binets.fr' const AUTH_URL = 'https://auth.binets.fr'
...@@ -61,12 +61,16 @@ export const callbackSigmaUser = async ({ response, request, auth }: HttpContext ...@@ -61,12 +61,16 @@ export const callbackSigmaUser = async ({ response, request, auth }: HttpContext
if (!username || !name || !groups) if (!username || !name || !groups)
throw new Error('The user given by the auth server is incomplete') throw new Error('The user given by the auth server is incomplete')
const user = await NotSigmaUser.firstOrCreate({ const receivedUser = {
username, // Unique ? username, // Unique ?
name, name,
groups: groups as string[], // ! UGLY groups: groups as string[], // ! UGLY
}) isSigmaUser: true,
isAdmin: false,
}
const user = await User.firstOrCreate(receivedUser)
const token = await auth.use('api').login(user) const token = await auth.use('api').login(user)
return response.ok('Ok!')
return response.ok({ token, user })
} }
...@@ -2,15 +2,27 @@ import Hash from '@ioc:Adonis/Core/Hash' ...@@ -2,15 +2,27 @@ import Hash from '@ioc:Adonis/Core/Hash'
import { BaseModel, beforeSave, column } from '@ioc:Adonis/Lucid/Orm' import { BaseModel, beforeSave, column } from '@ioc:Adonis/Lucid/Orm'
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
export default class NotSigmaUser extends BaseModel { /** Both user connected with Sigma or as visitors are stored as `User`
* The `password` is only relevant for the visitors.
*/
export default class User extends BaseModel {
@column({ isPrimary: true }) @column({ isPrimary: true })
public id: number public id: number
@column() @column()
public username: string public username: string
@column()
public name: string
@column()
public groups: string[]
@column({ serializeAs: null }) @column({ serializeAs: null })
public password: string public password: string | null // Password is null for Sigma users
@column()
public isSigmaUser: boolean
@column() @column()
public isAdmin: boolean public isAdmin: boolean
...@@ -22,9 +34,9 @@ export default class NotSigmaUser extends BaseModel { ...@@ -22,9 +34,9 @@ export default class NotSigmaUser extends BaseModel {
public updatedAt: DateTime public updatedAt: DateTime
@beforeSave() @beforeSave()
public static async hashPassword(notSigmaUser: NotSigmaUser) { public static async hashPassword(user: User) {
if (notSigmaUser.$dirty.password) { if (user.$dirty.password && user.password) {
notSigmaUser.password = await Hash.make(notSigmaUser.password) user.password = await Hash.make(user.password)
} }
} }
} }
...@@ -100,7 +100,7 @@ const authConfig: AuthConfig = { ...@@ -100,7 +100,7 @@ const authConfig: AuthConfig = {
| that time. | that time.
| |
*/ */
model: () => import('App/Models/NotSigmaUser'), model: () => import('App/Models/User'),
}, },
}, },
}, },
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* file. * file.
*/ */
import NotSigmaUser from 'App/Models/NotSigmaUser' import User from 'App/Models/User'
declare module '@ioc:Adonis/Addons/Auth' { declare module '@ioc:Adonis/Addons/Auth' {
/* /*
...@@ -34,8 +34,8 @@ declare module '@ioc:Adonis/Addons/Auth' { ...@@ -34,8 +34,8 @@ declare module '@ioc:Adonis/Addons/Auth' {
| |
*/ */
user: { user: {
implementation: LucidProviderContract<typeof NotSigmaUser> implementation: LucidProviderContract<typeof User>
config: LucidProviderConfig<typeof NotSigmaUser> config: LucidProviderConfig<typeof User>
} }
} }
......
import BaseSchema from '@ioc:Adonis/Lucid/Schema' import BaseSchema from '@ioc:Adonis/Lucid/Schema'
export default class extends BaseSchema { export default class extends BaseSchema {
protected tableName = 'not_sigma_users' protected tableName = 'users'
public async up() { public async up() {
this.schema.createTable(this.tableName, (table) => { this.schema.createTable(this.tableName, (table) => {
table.increments('id').primary() table.increments('id').primary()
table.string('username', 255).notNullable().unique() table.string('username', 255).notNullable().unique()
table.string('password', 180).notNullable() table.string('name', 255).notNullable()
table.specificType('groups', 'text[]').notNullable()
table.string('password', 180)
table.boolean('is_sigma_user').notNullable()
table.boolean('is_admin').notNullable().defaultTo(false) table.boolean('is_admin').notNullable().defaultTo(false)
/** /**
......
...@@ -6,12 +6,7 @@ export default class extends BaseSchema { ...@@ -6,12 +6,7 @@ export default class extends BaseSchema {
public async up() { public async up() {
this.schema.createTable(this.tableName, (table) => { this.schema.createTable(this.tableName, (table) => {
table.increments('id').primary() table.increments('id').primary()
table table.integer('user_id').unsigned().references('id').inTable('users').onDelete('CASCADE')
.integer('user_id')
.unsigned()
.references('id')
.inTable('not_sigma_users')
.onDelete('CASCADE')
table.string('name').notNullable() table.string('name').notNullable()
table.string('type').notNullable() table.string('type').notNullable()
table.string('token', 64).notNullable().unique() table.string('token', 64).notNullable().unique()
......
import BaseSeeder from '@ioc:Adonis/Lucid/Seeder' import BaseSeeder from '@ioc:Adonis/Lucid/Seeder'
import NotSigmaUser from 'App/Models/NotSigmaUser' import User from 'App/Models/User'
export default class extends BaseSeeder { export default class extends BaseSeeder {
public async run() { public async run() {
await NotSigmaUser.createMany([ await User.createMany([
{ {
username: 'admin', username: 'admin',
name: 'Administrateur',
password: '0000', password: '0000',
isAdmin: true, isAdmin: true,
isSigmaUser: false,
groups: [],
}, },
{ {
username: 'thibaut', username: 'thibaut',
name: 'Thibaut',
password: '0000', password: '0000',
isAdmin: false, isAdmin: false,
isSigmaUser: false,
groups: ['binet_reseau'],
}, },
{ {
username: 'thomas', username: 'thomas',
name: 'Thomas',
password: '0000', password: '0000',
isAdmin: false, isAdmin: false,
isSigmaUser: false,
groups: ['binet_reseau', 'binet_photo'],
}, },
{ {
username: 'emre', username: 'emre',
name: 'Emre',
password: '0000', password: '0000',
isAdmin: false, isAdmin: false,
isSigmaUser: false,
groups: ['binet_reseau'],
}, },
]) ])
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
*/ */
import Bouncer from '@ioc:Adonis/Addons/Bouncer' import Bouncer from '@ioc:Adonis/Addons/Bouncer'
import NotSigmaUser from 'App/Models/NotSigmaUser' import User from 'App/Models/User'
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
...@@ -30,7 +30,7 @@ import NotSigmaUser from 'App/Models/NotSigmaUser' ...@@ -30,7 +30,7 @@ import NotSigmaUser from 'App/Models/NotSigmaUser'
| NOTE: Always export the "actions" const from this file | NOTE: Always export the "actions" const from this file
|**************************************************************** |****************************************************************
*/ */
export const { actions } = Bouncer.define('isAdmin', (user: NotSigmaUser) => { export const { actions } = Bouncer.define('isAdmin', (user: User) => {
return user.isAdmin ? true : Bouncer.deny('This can only be done by an admin') return user.isAdmin ? true : Bouncer.deny('This can only be done by an admin')
}) })
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment