diff --git a/leaveschool/user/src/main/java/com/supwisdom/leaveschool/user/util/AuthUtil.java b/leaveschool/user/src/main/java/com/supwisdom/leaveschool/user/util/AuthUtil.java
deleted file mode 100644
index 29366aa..0000000
--- a/leaveschool/user/src/main/java/com/supwisdom/leaveschool/user/util/AuthUtil.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.supwisdom.leaveschool.user.util;
-
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-public class AuthUtil {
-
-  private static final Logger logger = LoggerFactory.getLogger(AuthUtil.class);
-
-  public static String getRemoteUser() {
-    
-    if (RequestContextHolder.getRequestAttributes() != null) {
-      ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
-      if (servletRequestAttributes != null) {
-        HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
-        if (httpServletRequest != null) {
-          String remoteUser = httpServletRequest.getRemoteUser();
-          logger.debug("httpServletRequest.getRemoteUser(): {}", remoteUser);
-          
-          if (remoteUser == null || remoteUser.isEmpty()) {
-            remoteUser = httpServletRequest.getHeader("remote_user");
-            logger.debug("remote_user: {}", remoteUser);
-          }
-          
-          if (remoteUser != null) {
-            return remoteUser;
-          }
-
-          if (logger.isDebugEnabled()) {
-            logger.debug("request headers: ");
-            Enumeration<String> headerNames = httpServletRequest.getHeaderNames();
-            while(headerNames.hasMoreElements()) {
-              String headerName = headerNames.nextElement();
-              logger.debug("{}: {}", headerName, httpServletRequest.getHeader(headerName));
-            }
-            logger.debug("request headers: ");
-          }
-          
-        }
-      }
-    }
-    
-    //logger.warn("FIXME: currentUsername. return 'user' by default.");
-    //return "user";  // FIXME: currentUsername
-    throw new RuntimeException("exception.authentication.remote.user.must.not.empty");
-
-    /*
-    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-    if (authentication == null) {
-      logger.error("authentication is null");
-      return null;
-    }
-
-    logger.debug("authentication is {}", authentication.getPrincipal());
-
-    if (!authentication.isAuthenticated()) {
-      logger.error("authentication is not authenticated");
-      return null;
-    }
-
-    if (authentication.getPrincipal() == null) {
-      logger.error("authentication's principal is null");
-      return null;
-    }
-
-    logger.debug("authentication's principal is {}", authentication.getPrincipal());
-
-    //if (authentication.getPrincipal() instanceof MyUser) {
-    //  return ((MyUser) authentication.getPrincipal()).getUsername();
-    //}
-    if (authentication.getPrincipal() instanceof String) {
-      return String.valueOf(authentication.getPrincipal());
-    }
-    
-
-    return null;
-    */
-  }
-
-}
