Files
auth-service/internal/handler/users.go
Ганеев Артем 397dad830f Добавлена гибкая система авторизации на основе ролей
- Добавлен базовый middleware userIdentity для валидации токенов
- Реализован middleware requireRole для проверки конкретных ролей
- Добавлены вспомогательные методы requireAdmin, requireTeacher, requireStudent
- Обновлена структура роутов с разделением прав доступа
- Добавлены примеры handler'ов: getAllUsers, getUserByUsername, deleteUser
- Исправлен роутинг api группы (было router.Group, стало serviceRouter.Group)

Теперь поддерживается:
- GET /api/users - доступ для всех авторизованных пользователей
- GET /api/users/:username - доступ для всех авторизованных
- POST /api/users/:username - только для администраторов
- DELETE /api/users/:username - только для администраторов

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 21:23:29 +03:00

76 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handler
import (
"net/http"
"github.com/gin-gonic/gin"
)
type ChangeUserRoleRequest struct {
Role string `json:"role"`
}
// changeUserRole - изменение роли пользователя (только для админов)
func (h *Handler) changeUserRole(c *gin.Context) {
var input ChangeUserRoleRequest
if err := c.BindJSON(&input); err != nil {
newErrorResponse(c, http.StatusBadRequest, err.Error())
return
}
username := c.Param("username")
if username == "" {
newErrorResponse(c, http.StatusBadRequest, "Ошибка в строке запроса")
return
}
role, err := h.services.ChangeUserRole(username, input.Role)
if err != nil {
newErrorResponse(c, http.StatusBadRequest, err.Error())
return
}
c.JSON(http.StatusOK, map[string]interface{}{
"newRole": role,
})
}
// Примеры других handler'ов для демонстрации использования middleware
// getAllUsers - получить список всех пользователей (доступно всем авторизованным)
func (h *Handler) getAllUsers(c *gin.Context) {
// Получаем роль текущего пользователя из контекста
userRole, _ := c.Get(userRoleKey)
c.JSON(http.StatusOK, map[string]interface{}{
"message": "Список пользователей",
"your_role": userRole,
"access_level": "любой авторизованный пользователь",
})
}
// getUserByUsername - получить пользователя по username (доступно всем авторизованным)
func (h *Handler) getUserByUsername(c *gin.Context) {
username := c.Param("username")
userRole, _ := c.Get(userRoleKey)
c.JSON(http.StatusOK, map[string]interface{}{
"message": "Информация о пользователе",
"username": username,
"your_role": userRole,
"access_level": "любой авторизованный пользователь",
})
}
// deleteUser - удалить пользователя (только для админов)
func (h *Handler) deleteUser(c *gin.Context) {
username := c.Param("username")
c.JSON(http.StatusOK, map[string]interface{}{
"message": "Пользователь удален",
"username": username,
"access_level": "только администраторы",
})
}