mirror of
https://github.com/hay-kot/mealie.git
synced 2025-07-30 19:50:19 -07:00
Feature: Add "Authentication Method" to allow existing users to sign in with LDAP (#2143)
* adds authentication method for users * fix db migration with postgres * tests for auth method * update migration ids * hide auth method on user creation form * (docs): Added documentation for the new authentication method * update migration * add to auto-form instead of having hidden fields
This commit is contained in:
parent
39012adcc1
commit
2e6ad5da8e
24 changed files with 213 additions and 24 deletions
|
@ -18,7 +18,7 @@
|
|||
:label="inputField.label"
|
||||
:name="inputField.varName"
|
||||
:hint="inputField.hint || ''"
|
||||
:disabled="updateMode && inputField.disableUpdate"
|
||||
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
@change="emitBlur"
|
||||
/>
|
||||
|
||||
|
@ -26,8 +26,8 @@
|
|||
<v-text-field
|
||||
v-else-if="inputField.type === fieldTypes.TEXT || inputField.type === fieldTypes.PASSWORD"
|
||||
v-model="value[inputField.varName]"
|
||||
:readonly="inputField.disableUpdate && updateMode"
|
||||
:disabled="inputField.disableUpdate && updateMode"
|
||||
:readonly="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
filled
|
||||
:type="inputField.type === fieldTypes.PASSWORD ? 'password' : 'text'"
|
||||
rounded
|
||||
|
@ -46,8 +46,8 @@
|
|||
<v-textarea
|
||||
v-else-if="inputField.type === fieldTypes.TEXT_AREA"
|
||||
v-model="value[inputField.varName]"
|
||||
:readonly="inputField.disableUpdate && updateMode"
|
||||
:disabled="inputField.disableUpdate && updateMode"
|
||||
:readonly="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
filled
|
||||
rounded
|
||||
class="rounded-lg"
|
||||
|
@ -66,7 +66,8 @@
|
|||
<v-select
|
||||
v-else-if="inputField.type === fieldTypes.SELECT"
|
||||
v-model="value[inputField.varName]"
|
||||
:readonly="inputField.disableUpdate && updateMode"
|
||||
:readonly="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate)"
|
||||
filled
|
||||
rounded
|
||||
class="rounded-lg"
|
||||
|
@ -75,6 +76,8 @@
|
|||
:name="inputField.varName"
|
||||
:items="inputField.options"
|
||||
:return-object="false"
|
||||
:hint="inputField.hint"
|
||||
persistent-hint
|
||||
lazy-validation
|
||||
@blur="emitBlur"
|
||||
>
|
||||
|
|
|
@ -29,6 +29,14 @@ export const useUserForm = () => {
|
|||
type: fieldTypes.PASSWORD,
|
||||
rules: ["required", "minLength:8"],
|
||||
},
|
||||
{
|
||||
label: "Authentication Method",
|
||||
varName: "authMethod",
|
||||
type: fieldTypes.SELECT,
|
||||
hint: "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'",
|
||||
disableCreate: true,
|
||||
options: [{ text: "Mealie" }, { text: "LDAP" }],
|
||||
},
|
||||
{
|
||||
section: "Permissions",
|
||||
label: "Administrator",
|
||||
|
|
|
@ -667,6 +667,7 @@
|
|||
"admin": "Admin",
|
||||
"are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link <b>{link}<b/>?",
|
||||
"are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user <b>{activeName} ID: {activeId}<b/>?",
|
||||
"auth-method": "Auth Method",
|
||||
"confirm-link-deletion": "Confirm Link Deletion",
|
||||
"confirm-password": "Confirm Password",
|
||||
"confirm-user-deletion": "Confirm User Deletion",
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
||||
*/
|
||||
|
||||
export type AuthMethod = "Mealie" | "LDAP";
|
||||
|
||||
export interface ChangePassword {
|
||||
currentPassword: string;
|
||||
newPassword: string;
|
||||
|
@ -53,6 +55,7 @@ export interface UserOut {
|
|||
username?: string;
|
||||
fullName?: string;
|
||||
email: string;
|
||||
authMethod?: AuthMethod & string;
|
||||
admin?: boolean;
|
||||
group: string;
|
||||
advanced?: boolean;
|
||||
|
@ -99,6 +102,7 @@ export interface PrivateUser {
|
|||
username?: string;
|
||||
fullName?: string;
|
||||
email: string;
|
||||
authMethod?: AuthMethod & string;
|
||||
admin?: boolean;
|
||||
group: string;
|
||||
advanced?: boolean;
|
||||
|
@ -150,6 +154,7 @@ export interface UserBase {
|
|||
username?: string;
|
||||
fullName?: string;
|
||||
email: string;
|
||||
authMethod?: AuthMethod & string;
|
||||
admin?: boolean;
|
||||
group?: string;
|
||||
advanced?: boolean;
|
||||
|
@ -162,6 +167,7 @@ export interface UserFavorites {
|
|||
username?: string;
|
||||
fullName?: string;
|
||||
email: string;
|
||||
authMethod?: AuthMethod & string;
|
||||
admin?: boolean;
|
||||
group?: string;
|
||||
advanced?: boolean;
|
||||
|
@ -214,6 +220,7 @@ export interface UserIn {
|
|||
username?: string;
|
||||
fullName?: string;
|
||||
email: string;
|
||||
authMethod?: AuthMethod & string;
|
||||
admin?: boolean;
|
||||
group?: string;
|
||||
advanced?: boolean;
|
||||
|
|
|
@ -67,6 +67,7 @@ export default defineComponent({
|
|||
canManage: false,
|
||||
canOrganize: false,
|
||||
password: "",
|
||||
authMethod: "Mealie",
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -92,5 +93,4 @@ export default defineComponent({
|
|||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
|
|
@ -131,6 +131,7 @@ export default defineComponent({
|
|||
{ text: i18n.t("user.full-name"), value: "fullName" },
|
||||
{ text: i18n.t("user.email"), value: "email" },
|
||||
{ text: i18n.t("group.group"), value: "group" },
|
||||
{ text: i18n.t("user.auth-method"), value: "authMethod" },
|
||||
{ text: i18n.t("user.admin"), value: "admin" },
|
||||
{ text: i18n.t("general.delete"), value: "actions", sortable: false, align: "center" },
|
||||
];
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
type FormFieldType = "text" | "textarea" | "list" | "select" | "object" | "boolean" | "color" | "password";
|
||||
|
||||
export interface FormSelectOption {
|
||||
text: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface FormField {
|
||||
section?: string;
|
||||
sectionDetails?: string;
|
||||
|
@ -9,6 +14,8 @@ export interface FormField {
|
|||
type: FormFieldType;
|
||||
rules?: string[];
|
||||
disableUpdate?: boolean;
|
||||
disableCreate?: boolean;
|
||||
options?: FormSelectOption[];
|
||||
}
|
||||
|
||||
export type AutoFormItems = FormField[];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue