1. 서론
Laravel에서는 Gates & Policies를 활용해 사용자 권한을 제어하며, Spring Boot에서는 Spring Security의 Role 기반 접근 제어를 사용합니다.
이번 글에서는 Laravel의 사용자 권한 시스템을 Spring Boot로 변환하는 방법을 다룹니다.
✅ Laravel의 Gates & Policies vs Spring Security의 Role 관리 비교
✅ 사용자 역할(Role) 및 권한(Permission) 설정 방법
✅ Spring Boot에서 관리자(Admin) & 일반 사용자(User) 구분
✅ 컨트롤러 및 API에서 권한 적용하는 방법
2. Laravel과 Spring Boot의 권한 시스템 비교
비교 항목Laravel (PHP)Spring Boot (Java)
권한 제어 방식 | Gates & Policies | Role 기반 접근 제어 (@PreAuthorize) |
역할(Role) 저장 방식 | roles 테이블 활용 | ROLE_USER, ROLE_ADMIN 등의 Enum 활용 |
API 접근 제어 | $user->can('edit-post') | @PreAuthorize("hasRole('ADMIN')") |
데이터베이스 연동 | belongsToMany() | @ManyToMany |
✅ 변환 전략
• Laravel의 Gate::define() → Spring Boot의 @PreAuthorize()로 변환
• Laravel의 역할(Role) 및 권한(Permission) 관리 → Spring Boot의 Enum 및 JPA 활용
3. 사용자 역할(Role) 설정 (Laravel Role → Spring Boot Role Enum)
Laravel에서는 roles 테이블을 생성하여 역할을 관리합니다.
🔹 Laravel의 Role 테이블과 관계 설정
class User extends Authenticatable {
public function roles() {
return $this->belongsToMany(Role::class);
}
}
Spring Boot에서는 Enum을 활용하여 역할을 정의할 수 있습니다.
🔹 Spring Boot의 Role Enum 변환
public enum Role {
ROLE_USER,
ROLE_ADMIN
}
✅ 변환 전략
• Laravel의 roles 테이블을 Enum으로 변환하여 사용
4. 데이터베이스에 사용자 역할(Role) 저장
Laravel에서는 Pivot 테이블을 활용하여 사용자와 역할을 연결합니다.
🔹 Laravel의 Pivot 테이블 활용
Schema::create('role_user', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->foreignId('role_id')->constrained();
});
Spring Boot에서는 Many-to-Many 관계를 설정하여 역할을 저장합니다.
🔹 Spring Boot의 Many-to-Many 관계 설정
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String password;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
@Enumerated(EnumType.STRING)
private Set<Role> roles = new HashSet<>();
}
✅ 변환 전략
• Laravel의 belongsToMany() 관계를 Spring Boot의 @ElementCollection으로 변환
5. 사용자 권한(Role) 기반 API 접근 제어
Laravel에서는 Gates & Policies를 활용하여 특정 권한이 있는 사용자만 API를 호출할 수 있도록 제한합니다.
🔹 Laravel의 권한 검사 (Gate::define)
Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id;
});
if (Gate::allows('edit-post', $post)) {
// 사용자가 해당 게시글을 수정할 수 있음
}
Spring Boot에서는 **@PreAuthorize**를 사용하여 역할(Role) 기반의 접근 제어를 구현합니다.
🔹 Spring Boot의 권한 검사 (@PreAuthorize)
@PreAuthorize("hasRole('ADMIN')")
@PutMapping("/posts/{id}")
public ResponseEntity<Post> updatePost(@PathVariable Long id, @RequestBody Post postDetails) {
return ResponseEntity.ok(postService.updatePost(id, postDetails));
}
✅ 변환 전략
• Laravel의 Gate::define()을 Spring Boot의 @PreAuthorize()로 변환
• Laravel의 Gate::allows()를 Spring Boot의 SecurityContext 기반 검사로 변경
6. Spring Security에서 사용자 인증 및 역할 부여
Laravel에서는 Auth::user()->roles를 사용하여 현재 사용자의 역할을 가져옵니다.
Spring Boot에서는 UserDetailsService를 구현하여 인증된 사용자 정보를 관리할 수 있습니다.
🔹 Spring Boot의 UserDetailsService 구현
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userRepository.findByEmail(email)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
return new org.springframework.security.core.userdetails.User(
user.getEmail(),
user.getPassword(),
user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.name()))
.collect(Collectors.toList())
);
}
}
✅ 변환 전략
• Laravel의 Auth::user()->roles를 Spring Boot의 UserDetailsService로 변환
7. 관리자(Admin) & 일반 사용자(User) 구분
Laravel에서는 미들웨어를 활용하여 관리자(Admin)만 특정 API를 사용할 수 있도록 제한합니다.
🔹 Laravel의 관리자 미들웨어 (isAdmin)
public function handle($request, Closure $next) {
if (Auth::user()->role !== 'admin') {
return response()->json(['error' => 'Unauthorized'], 403);
}
return $next($request);
}
Spring Boot에서는 **@PreAuthorize("hasRole('ADMIN')")**를 사용하여 관리자만 API를 호출할 수 있도록 제한합니다.
🔹 Spring Boot의 관리자 권한 체크 (@PreAuthorize)
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin/dashboard")
public ResponseEntity<String> getAdminDashboard() {
return ResponseEntity.ok("Welcome, Admin!");
}
✅ 변환 전략
• Laravel의 isAdmin 미들웨어를 Spring Boot의 @PreAuthorize("hasRole('ADMIN')")로 변환
8. 결론
✅ Laravel의 Gates & Policies를 Spring Boot의 Role 기반 접근 제어로 변환하는 방법 설명
✅ Gate::define() → @PreAuthorize() 적용
✅ 관리자(Admin)와 일반 사용자(User) 역할 구분 적용
✅ 다음 글에서는 “Spring Boot에서 API 개발 최적화: Laravel API → Spring Boot REST API”를 다룰 예정!
'SpringBoot from Laravel' 카테고리의 다른 글
Spring Boot vs Laravel: OAuth2 소셜 로그인 (Google, Facebook, Kakao) 구현 (0) | 2025.02.13 |
---|---|
Spring Boot에서 API 보안 강화: Laravel과 비교한 JWT + OAuth2 적용 (0) | 2025.02.13 |
Spring Boot 성능 최적화: Laravel 대비 성능 향상 방법 (0) | 2025.02.13 |
Spring Boot에서 API 개발 최적화: Laravel API → Spring Boot REST API (0) | 2025.02.12 |
Spring Boot에서 인증 적용: Laravel Auth → Spring Security & JWT (0) | 2025.02.07 |
라우팅 & 컨트롤러 변환: Laravel → Spring Boot (0) | 2025.02.07 |
데이터베이스 변환: Laravel Eloquent → Spring Boot JPA (Hibernate) (0) | 2025.02.07 |
Laravel > Spring Boot 전환 전체 프로세스 (0) | 2025.02.07 |