Site icon PlusMagi's Blog By Pitt Phunsanit

Spring Security: Repository

หลังจากสร้าง Folder repository แล้ว คุณต้องมีไฟล์ Interface เพื่อให้ Spring Data JPA จัดการ Query ข้อมูลจาก SQL Server ครับ


สร้างไฟล์ Repository


UserRepository.java

src/main/java/com/example/demo/repository/UserRepository.java
ไฟล์นี้เปรียบเสมือนการสั่ง User::where('username', $username)->first() ใน Laravel เพื่อหาผู้ใช้

package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // เหมือนการเช็ค User::where('username', $username)->first() ใน Laravel
    Optional<User> findByUsername(String username);
    
    // เช็คว่ามี Email นี้หรือยัง (สำหรับ Register)
    Boolean existsByEmail(String email);
}

RoleRepository.java

src/main/java/com/example/demo/repository/RoleRepository.java
ไฟล์นี้เปรียบเสมือนการสั่ง Role::where('name', $name)->first() ใน Laravel เพื่อใช้เช็คสิทธิ์ของผู้ใช้

package com.example.demo.repository;

import com.example.demo.entity.Role;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;

@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
    
    // ค้นหา Role ด้วยชื่อ เช่น 'ROLE_ADMIN' หรือ 'ROLE_USER'
    Optional<Role> findByName(String name);

    // เช็คว่ามี Role นี้อยู่ในระบบหรือยัง
    Boolean existsByName(String name);
}

PermissionRepository.java

src/main/java/com/example/demo/repository/PermissionRepository.java
ไฟล์นี้ใช้จัดการสิทธิ์ย่อย ๆ ( Permissions ) เช่น การเช็คว่า User คนนี้สามารถ ‘edit-post’ ได้หรือไม่

package com.example.demo.repository;

import com.example.demo.entity.Permission;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
import java.util.Set;

@Repository
public interface PermissionRepository extends JpaRepository<Permission, Long> {
    
    // ค้นหาสิทธิ์ด้วยชื่อ เช่น 'user-create'
    Optional<Permission> findByName(String name);

    // ค้นหาหลายๆ Permission พร้อมกัน (ใช้ตอนประกาศสิทธิ์ให้ Role)
    Set<Permission> findByNameIn(Set<String> names);
}

วิธีการนำไปใช้งาน ( Usage Example )

เมื่อคุณมี Repository ครบแล้ว คุณสามารถเรียกใช้ใน Service เพื่อจัดการสิทธิ์ได้ง่ายๆ เหมือนใน Laravel เลยครับ

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private RoleRepository roleRepository;

    public void assignRoleToUser(Long userId, String roleName) {
        User user = userRepository.findById(userId).orElseThrow();
        Role role = roleRepository.findByName(roleName).orElseThrow();
        
        user.getRoles().add(role);
        userRepository.save(user); // เหมือน $user->assignRole($role)
    }
}

ข้อควรระวัง


Exit mobile version