이번 포스트에서는 라라벨 filament 관리자 패널에서 역할(Role)과 권한(Permission) 할당 기능을 구현하고, User 및 각 리소스 테이블의 UI를 실무 환경에 맞게 개선하는 과정을 알아보겠다.
이전 포스트
라라벨 filament, User 리소스 생성 및 비밀번호 조건부 필수 설정
역할(Role)에 권한(Permission) 할당 기능 구현 · 4th-avenue/laravel13-livewire@bd51314 · GitHub
User에 역할 부여 기능 구현 & User 리소스 테이블에 역할 표시 · 4th-avenue/laravel13-livewire@fda8073 · GitHub
filament 관리자 메뉴의 테이블들 수정 · 4th-avenue/laravel13-livewire@75bde0d · GitHub
전체적인 코드 수정은 이 깃허브 링크들을 통해서 확인할 수 있다.
보기 편하게 세 번으로 나눠서 커밋했다.
역할(Role)에 권한(Permission) 할당 기능 구현
app/Filament/Resources/Roles/Schemas/RoleForm.php
Select::make('permissions')
->placeholder('Select an option')
->multiple()
->relationship(titleAttribute: 'name')
->preload(),
이 필드는 역할에 여러 권한permissions을 부여할 수 있도록 추가되었다.
즉, Select 컴포넌트를 사용해 역할과 권한의 관계를 정의하고, 권한을 다중 선택할 수 있도록 설정했다.
->placeholder('Select an option'): Select 필드에 표시되는 기본 텍스트가 변경된다. 이제는 몰라도 되는 이야기지만, 이전에 filament 3 때에는 이 설정을 하지 않으면 원래 한글로 '옵션 선택'이라는 텍스트가 떴었다. 문제는 마지막 글자인 '택'이 반쯤 잘린 채로 표시됐었다. 그때는 그게 거슬려서 기본 텍스트를 변경했었다. 변경한 텍스트가 한글일 경우에는 변경된 텍스트도 잘렸었고, 영어로 해야 잘리지 않았었다. 그런데 filament 버전이 5인 지금은 그 문제가 사라졌다.->multiple(): 한 번에 여러 권한을 선택할 수 있게 만든다. 즉, 역할에 대해 여러 개의 권한을 부여할 수 있다.->relationship(titleAttribute: 'name'): permissions와 role 간의 관계를 정의한다. 여기서는 permissions 테이블의 name 필드를 사용해 권한 목록을 표시한다. 즉, 사용자 인터페이스에서는 permissions의 이름이 선택할 항목으로 보여진다.->preload(): 페이지가 렌더링될 때 DB의 모든 권한 목록을 한 번에 브라우저로 가져온다. 권한을 선택할 때 관련된 데이터가 미리 불러와져서 빠르게 선택할 수 있게 한다. 데이터 개수가 수십 개 내외로 적을 때 유용하며, 검색 시 추가 서버 요청이 없어 반응 속도가 빠르다.
테스트를 위해 권한Permission을 몇 개 만들어보았다.
권한의 이름은 자유롭게 바꿔도 상관없다.
이제 역할Role을 새로 만들거나 수정하면 이렇게 역할에 권한을 부여할 수 있게 된다.
사용자에게 역할 부여 기능 구현
app/Filament/Resources/Users/Schemas/UserForm.php
Select::make('roles')
->relationship(titleAttribute: 'name')
->preload(),
사용자에게 역할을 부여하는 Select 필드를 만들었다.
위에서 설명했던 RoleForm.php의 코드들과 동일하니, 설명은 생략하겠다.
이제 새 계정을 생성할 때나 기존의 계정을 수정할 때, 사용자에게 역할을 부여할 수 있게 됐다.
그리고 이제부터 설명하는 코드들은 전부 app/Filament/Resources/Users/Tables/UsersTable.php에 추가된 코드들이다.
코드를 추가하는 위치는 포스트 상단에 올려놓은 깃허브 링크를 통해 확인하자.
TextColumn::make('id')
->sortable(),
id에 ->sortable()을 추가해서 id로 정렬할 수 있도록 설정했다.
이제 테이블에서 해당 열의 헤더(제목)를 클릭하면 ID를 기준으로 오름차순 또는 내림차순으로 정렬할 수 있다.
TextColumn::make('roles.name')
->label('Role')
->searchable()
->toggleable(isToggledHiddenByDefault: true),
filament 리소스의 User 테이블에 역할을 표시하도록 코드를 추가했다.
TextColumn::make('roles.name'): User 테이블에 표시할 roles 관계에서 name 필드를 가져와 텍스트 컬럼을 만든다. 즉, 사용자가 부여받은 Role의 이름이 테이블에 표시된다.->label('Role'): 테이블 헤더에 표시될 컬럼의 레이블(이름)을 설정한다. 이 경우 Role이라는 이름이 보이게 된다.->searchable(): 이 메서드는 역할 이름에 대해 검색이 가능하도록 설정한다. 관리자가 테이블 위에 있는 검색창에서 역할 이름을 기준으로 사용자를 검색할 수 있다.->toggleable(isToggledHiddenByDefault: true): 이 메서드는 컬럼이 기본적으로 숨겨진 상태로 표시되게 설정한다. 즉, 사용자는 원하는 경우에만 이 컬럼을 보이도록 할 수 있다. 테이블의 컬럼을 동적으로 토글할 수 있는 기능을 제공하는 것이다.
->dateTime('Y-m-d H:i:s')
날짜 형식을 지정했다.
email_verified_at과 created_at과 updated_at, 날짜를 저장하는 컬럼들에 전부 추가했다.
여기서는 Y-m-d H:i:s 형식(예: 2026-09-23 20:46:13)으로 표시되도록 설정되었다.
(원래는 9월 23, 2026 20:46:13와 같은 형식으로 표시된다.)
->defaultSort('id', 'desc')
이 메서드를 이용해서 테이블이 기본적으로 어떤 컬럼을 기준으로 어떻게 정렬될 것인지 설정할 수 있다.
여기서는 id 컬럼 기준으로 내림차순(DESC) 정렬하여 보여준다.
내림차순은 가장 최근에 등록된 데이터(가장 큰 id 값)가 목록 맨 위에 먼저 나타나도록 만드는 것이다.
filament 관리자 메뉴의 다른 테이블들도 수정
UsersTable이 바뀐 김에 다른 테이블들도 신경 쓰였던 부분들을 전부 수정해 보겠다.
이제부터는 중복된 코드들이 많이 나오기 때문에 추가된 코드들을 전부 쓰지는 않겠다.
추가된 코드나 추가하는 위치는 포스트 상단에 올려놓은 깃허브 링크를 통해 확인하자.
app/Filament/Resources/Articles/Tables/ArticlesTable.php
DeleteAction::make(),
테이블에서 글을 삭제할 수 있는 삭제 액션을 추가했다.
테이블 행마다 삭제 버튼이 표시되며, 이 버튼을 통해 글을 삭제할 수 있다.
수정 페이지에 삭제 버튼이 이미 있기 때문에 굳이 필요하지는 않지만, 그냥 이런 방법도 있다는 것을 보여주기 위해 추가해 봤다.
이외에도 ArticlesTable.php에서 여기저기 수정해야 할 곳들이 많다.
그리고 CategoriesTable.php, PermissionsTable.php, RolesTable.php도 수정해야 하는데, 딱히 새로운 코드는 나오지 않기 때문에 설명할 것이 없다.
위에서 말했던 것처럼 다른 수정 사항은 깃허브 링크를 통해 확인하자.
app/Policies/ArticlePolicy.php
public function view(User $user, Article $article): bool
{
return true;
}
ArticlePolicy의 view 메서드를 false에서 true로 바꿨다.
바꾼 이유는 이미지와 함께 설명하겠다.
수정 전의 Article 리소스 테이블이다.
그리고 이게 수정 후의 Article 리소스 테이블이다.
ArticlesTable.php에서 DeleteAction::make(),를 추가해서 테이블 행에 삭제 버튼이 생겼다.
그리고 ArticlePolicy.php에서 view 메서드를 수정해서 테이블 행마다 보기 버튼도 생겼다.
원래 웹사이트의 관리자는 본인이 쓴 글뿐만 아니라, 모든 글을 수정하거나 삭제할 수 있어야 한다.
아직 그 권한 설정이 안 되어 있어서 현재는 본인이 쓴 글에만 수정・삭제 버튼이 뜨고 있다.
물론 이 문제도 나중에 차근차근 수정해 나갈 거다.
참고로, 위에서 설명했던 ->toggleable(isToggledHiddenByDefault: true)로 숨겨진 컬럼을 보이게 하고 싶다면, 하늘색 동그라미로 표시해 놓은 부분을 클릭해서 체크박스가 해제되어 있는 컬럼을 체크하고, '열 적용' 버튼을 클릭하면 된다.
다음 포스트





0 Comments
댓글 쓰기
🔸 댓글은 블로그 운영자의 승인 후에 블로그에 표시됩니다.
🔸 비로그인 방문자 분께서는 '익명'보다 이름/URL로 댓글을 남겨주시면 감사하겠습니다. (URL은 생략 가능합니다.)
🔸 구글 로그인 방문자는 '알림 사용'에 체크를 하시면, 남겨주신 댓글에 대한 답글 알림을 메일로 받아볼 수 있습니다. 📩