diff --git a/pkg/service/session.go b/pkg/service/session.go
new file mode 100644
index 0000000..51fd5bd
--- /dev/null
+++ b/pkg/service/session.go
@@ -0,0 +1,68 @@
+package service
+
+import (
+	"context"
+
+	"git.itzana.me/strafesnet/maps-service/pkg/api"
+)
+
+// SessionRoles implements getSessionRoles operation.
+//
+// Get bitflags of permissions the currently logged in user has.
+//
+// GET /session/roles
+func (svc *Service) SessionRoles(ctx context.Context) (*api.Roles, error) {
+	userInfo, ok := ctx.Value("UserInfo").(UserInfoHandle)
+	if !ok {
+		return nil, ErrUserInfo
+	}
+
+	roles, err := userInfo.GetRoles();
+	if err != nil {
+		return nil, err
+	}
+
+	return &api.Roles{Roles: int32(roles)}, nil
+}
+
+// SessionUser implements sessionUser operation.
+//
+// Get information about the currently logged in user.
+//
+// GET /session/roles
+func (svc *Service) SessionUser(ctx context.Context) (*api.User, error) {
+	userInfoHandle, ok := ctx.Value("UserInfo").(UserInfoHandle)
+	if !ok {
+		return nil, ErrUserInfo
+	}
+
+	userInfo, err := userInfoHandle.GetUserInfo();
+	if err != nil {
+		return nil, err
+	}
+
+	return &api.User{
+		UserID:int64(userInfo.UserID),
+		Username:userInfo.Username,
+		AvatarURL:userInfo.AvatarURL,
+	}, nil
+}
+
+// SessionUser implements sessionUser operation.
+//
+// Get information about the currently logged in user.
+//
+// GET /session/roles
+func (svc *Service) SessionValidate(ctx context.Context) (bool, error) {
+	userInfoHandle, ok := ctx.Value("UserInfo").(UserInfoHandle)
+	if !ok {
+		return false, ErrUserInfo
+	}
+
+	valid, err := userInfoHandle.Validate();
+	if err != nil {
+		return false, err
+	}
+
+	return valid, nil
+}