본문 바로가기

SpringBoot from Laravel

Spring Boot에서 사용자 권한(Role) 관리: Laravel의 Gates & Policies vs Spring Security

반응형

 

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”를 다룰 예정!

반응형