// Authorize проверяет авторизацию пользователя и только в случае успешной // авторизации запускает обработчик запроса. func (a *Auth) Authorize(c *rest.Context) error { // получаем имя MX-сервера из пути mxname := c.Param("mx-name") // проверяем псевдонимы и делаем редирект на основное имя if name, ok := a.aliases[mxname]; ok { var url = strings.Replace(c.Request.URL.Path, mxname, name, 1) var status = http.StatusMovedPermanently var method = c.Request.Method if method != "GET" && method != "HEAD" { status = http.StatusPermanentRedirect } return c.Redirect(status, url) } // редирект для данного псевдонима не определен auth, ok := a.mxlist[mxname] // проверяем, что сервер с таким именем определен if !ok { return c.Error(http.StatusNotFound, fmt.Sprintf("mx %s not found", mxname)) } // проверяем авторизацию, переданную в запросе login, password, ok := c.BasicAuth() if !ok { realm := fmt.Sprintf("Basic realm=%q", mxname) c.SetHeader("WWW-Authenticate", realm) return rest.ErrUnauthorized } // проверяем авторизацию пользователя на сервере MX или в кеше ui, err := auth.Login(login, password) switch err := err.(type) { case nil: break case *mxlogin.Error: // неверная авторизация // if err.Code == 6 { // break // пользователь уже залогинен // } return c.Error(http.StatusForbidden, err.Error()) default: // проблемы с подключением к MX серверу return c.Error(http.StatusServiceUnavailable, err.Error()) } // сохраняем идентификатор пользователя c.SetData(userID, ui.ID) return nil }