Implement RBAC

This commit is contained in:
Konstantin Hintermayer 2024-10-04 10:31:09 +02:00
parent 5251a637de
commit 70afa170ec
5 changed files with 30 additions and 2 deletions

View File

@ -0,0 +1,22 @@
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL,
"firstName" TEXT,
"lastName" TEXT,
"hashedPassword" TEXT,
"salt" TEXT,
"resetToken" TEXT,
"resetTokenExpiresAt" DATETIME,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
"roles" TEXT NOT NULL DEFAULT 'user'
);
INSERT INTO "new_User" ("createdAt", "email", "firstName", "hashedPassword", "id", "lastName", "resetToken", "resetTokenExpiresAt", "salt", "updatedAt") SELECT "createdAt", "email", "firstName", "hashedPassword", "id", "lastName", "resetToken", "resetTokenExpiresAt", "salt", "updatedAt" FROM "User";
DROP TABLE "User";
ALTER TABLE "new_User" RENAME TO "User";
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;

View File

@ -35,6 +35,7 @@ model User {
resetTokenExpiresAt DateTime? resetTokenExpiresAt DateTime?
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
roles String @default("user")
} }
model Identity { model Identity {

View File

@ -36,7 +36,7 @@ export const getCurrentUser = async (session: Decoded) => {
return await db.user.findUnique({ return await db.user.findUnique({
where: { id: session.id }, where: { id: session.id },
select: { id: true }, select: { id: true, email: true, roles: true },
}) })
} }

View File

@ -16,7 +16,7 @@ import { useAuth } from './auth'
const Routes = () => { const Routes = () => {
return ( return (
<Router useAuth={useAuth}> <Router useAuth={useAuth}>
<PrivateSet unauthenticated="home"> <PrivateSet unauthenticated="home" roles="admin">
<Set wrap={ScaffoldLayout} title="Posts" titleTo="posts" buttonLabel="New Post" buttonTo="newPost"> <Set wrap={ScaffoldLayout} title="Posts" titleTo="posts" buttonLabel="New Post" buttonTo="newPost">
<Route path="/admin/posts/new" page={PostNewPostPage} name="newPost" /> <Route path="/admin/posts/new" page={PostNewPostPage} name="newPost" />
<Route path="/admin/posts/{id:Int}/edit" page={PostEditPostPage} name="editPost" /> <Route path="/admin/posts/{id:Int}/edit" page={PostEditPostPage} name="editPost" />

View File

@ -2,7 +2,11 @@
import { Link } from '@redwoodjs/router' import { Link } from '@redwoodjs/router'
import { Metadata } from '@redwoodjs/web' import { Metadata } from '@redwoodjs/web'
import { useAuth } from 'src/auth'
const HomePage = () => { const HomePage = () => {
const user = useAuth()
return ( return (
<> <>
<Metadata title="Home" description="Home page" /> <Metadata title="Home" description="Home page" />
@ -15,6 +19,7 @@ const HomePage = () => {
My default route is named `home`, link to me with: My default route is named `home`, link to me with:
`<Link to={routes.home()}>Home</Link>` `<Link to={routes.home()}>Home</Link>`
*/} */}
{user && user.isAuthenticated + ' ' + user.hasRole('admin')}
<Link to={'/login'}>Login</Link> <Link to={'/login'}>Login</Link>
</> </>
) )