[java] MyBatis에서 인증과 권한 제어 처리하기

웹 애플리케이션에서 인증과 권한 제어는 매우 중요한 부분입니다. 사용자가 로그인하고, 특정 기능에 접근할 권한이 있는지 확인해야 합니다. MyBatis는 SQL 매퍼를 사용하여 데이터베이스와의 상호 작용을 쉽게 처리할 수 있는 자바 퍼시스턴스 프레임워크입니다. 이 글에서는 MyBatis를 사용하여 인증과 권한 제어를 처리하는 방법에 대해 알아보겠습니다.

1. 데이터베이스 구성

먼저, 인증과 권한 제어를 위해 데이터베이스 테이블을 구성해야 합니다. 예를 들어, users 테이블과 roles 테이블을 생성할 수 있습니다. users 테이블에는 사용자의 아이디, 비밀번호 등의 정보를 저장하고, roles 테이블에는 권한 정보를 저장합니다.

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(50) NOT NULL,
  role_id INT NOT NULL,
  CONSTRAINT fk_role FOREIGN KEY (role_id) REFERENCES roles(id)
);

CREATE TABLE roles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  role_name VARCHAR(50) NOT NULL
);

2. 인증 처리하기

사용자 인증은 주로 아이디와 비밀번호를 사용하여 처리됩니다. MyBatis를 사용하여 사용자 인증을 처리하려면 다음과 같은 단계를 따를 수 있습니다.

2.1. SQL 매퍼 인터페이스 작성하기

public interface UserMapper {
    User getUserByUsername(String username);
}

2.2. SQL 매퍼 XML 작성하기

<select id="getUserByUsername" parameterType="String" resultType="User">
    SELECT * FROM users WHERE username = #{username}
</select>

2.3. 사용자 인증 로직 작성하기

public class AuthService {
    private UserMapper userMapper;

    public boolean authenticate(String username, String password) {
        User user = userMapper.getUserByUsername(username);

        if (user != null && user.getPassword().equals(password)) {
            return true;
        }

        return false;
    }
}

3. 권한 제어 처리하기

인증 후 사용자의 권한을 확인하여 특정 기능에 대한 접근 제어를 해야 합니다. MyBatis를 사용하여 권한 제어를 처리하려면 다음과 같은 단계를 따를 수 있습니다.

3.1. SQL 매퍼 인터페이스 수정하기

public interface UserMapper {
    User getUserByUsername(String username);
    List<String> getRolesByUserId(int userId);
    List<String> getPermissionsByRoleId(int roleId);
}

3.2. SQL 매퍼 XML 수정하기

<select id="getRolesByUserId" parameterType="int" resultType="String">
    SELECT r.role_name FROM users u JOIN roles r ON u.role_id = r.id WHERE u.id = #{userId}
</select>

<select id="getPermissionsByRoleId" parameterType="int" resultType="String">
    SELECT p.permission_name FROM roles r JOIN permissions p ON r.permission_id = p.id WHERE r.id = #{roleId}
</select>

3.3. 권한 제어 로직 작성하기

public class AuthService {
    private UserMapper userMapper;

    public boolean hasAccess(String username, String permission) {
        User user = userMapper.getUserByUsername(username);
        List<String> roles = userMapper.getRolesByUserId(user.getId());

        for (String role : roles) {
            List<String> permissions = userMapper.getPermissionsByRoleId(role.getId());

            if (permissions.contains(permission)) {
                return true;
            }
        }

        return false;
    }
}

결론

MyBatis를 사용하여 인증과 권한 제어를 처리하는 방법에 대해 살펴보았습니다. 이를 통해 웹 애플리케이션에서 안전하고 제어된 접근을 구현할 수 있습니다. MyBatis의 간편한 SQL 매퍼를 활용하여 데이터베이스와의 연동을 쉽게 처리할 수 있으므로, 개발자들에게 편리함을 제공합니다.

참고 문헌: