[java] Apache Shiro와 사용자 권한 관리

Apache Shiro는 자바 기반의 강력한 보안 프레임워크로서, 사용자 인증 및 권한 관리를 손쉽게 처리할 수 있도록 도와줍니다. 이 글에서는 Apache Shiro를 사용하여 사용자 권한을 관리하는 방법을 알아보겠습니다.

Apache Shiro란?

Apache Shiro는 보안에 관련된 다양한 기능을 제공하는 라이브러리입니다. 사용자 인증, 인가, 세션 관리 등의 기능을 간편하게 처리할 수 있으며, 웹 애플리케이션과 네트워크 애플리케이션에 모두 적용할 수 있습니다.

사용자 권한 관리

사용자 권한을 관리하기 위해서는 Apache Shiro의 Realm 인터페이스를 구현해야 합니다. Realm은 사용자 정보와 권한 정보를 가져오는 역할을 합니다.

public class CustomRealm implements Realm {

    public String getName() {
        return "CustomRealm";
    }

    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        String username = userToken.getUsername();
        String password = new String(userToken.getPassword());

        // 사용자 정보를 데이터베이스 또는 다른 소스에서 가져온다.
        User user = userService.getUserByUsername(username);

        // 사용자가 없거나 비밀번호가 일치하지 않으면 예외를 발생시킨다.
        if (user == null || !user.getPassword().equals(password)) {
            throw new IncorrectCredentialsException();
        }

        // 사용자 인증 정보를 반환한다.
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }

    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();

        // 사용자의 권한 정보를 데이터베이스 또는 다른 소스에서 가져온다.
        Set<String> roles = userService.getRolesByUsername(username);

        // 사용자의 권한 정보를 반환한다.
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.setRoles(roles);
        return info;
    }
}

위의 예제 코드에서는 CustomRealm이라는 사용자 정의 Realm을 구현한 것을 볼 수 있습니다. CustomRealm은 사용자 인증 정보와 권한 정보를 데이터베이스 또는 다른 소스에서 가져오는 방법을 정의합니다.

getAuthenticationInfo 메서드에서는 사용자가 입력한 인증 정보를 기반으로 사용자를 인증하고, getAuthorizationInfo 메서드에서는 사용자의 권한 정보를 가져옵니다.

이후에는 Apache Shiro를 설정 파일에 등록하여 사용할 수 있습니다.

DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(new CustomRealm());

SecurityUtils.setSecurityManager(securityManager);

CustomRealmSecurityManager에 등록하고 SecurityUtils를 사용하여 보안 관련 작업을 수행할 수 있습니다.

결론

Apache Shiro를 사용하면 간단하게 사용자 인증 및 권한 관리를 구현할 수 있습니다. Realm 인터페이스를 구현하여 사용자 정보와 권한 정보를 가져오고, 이를 SecurityManager에 등록하여 적용할 수 있습니다. Apache Shiro를 통해 안전하고 보안성 있는 애플리케이션을 개발할 수 있습니다.

참고 자료