feat: domain-based login restriction

Users can only log in from domains belonging to their assigned company.
E.g. cuitunet users can only log in via intra.cuitunet.fi.
Admin users can still log in from any domain.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 16:36:05 +02:00
parent 1fa366d3ff
commit 14cdfafd40

18
api.php
View File

@@ -770,18 +770,24 @@ switch ($action) {
$password = $input['password'] ?? ''; $password = $input['password'] ?? '';
$u = dbGetUserByUsername($username); $u = dbGetUserByUsername($username);
if ($u && password_verify($password, $u['password_hash'])) { if ($u && password_verify($password, $u['password_hash'])) {
$userCompanies = $u['companies'] ?? [];
// Domain-pohjainen kirjautumisrajoitus
$host = strtolower(explode(':', $_SERVER['HTTP_HOST'] ?? '')[0]);
$domainCompany = dbGetCompanyByDomain($host);
$domainCompanyId = $domainCompany ? $domainCompany['id'] : '';
// Jos domain kuuluu tietylle yritykselle, vain sen yrityksen käyttäjät + adminit pääsevät sisään
if ($domainCompanyId && $u['role'] !== 'admin' && !in_array($domainCompanyId, $userCompanies)) {
dbRecordLoginAttempt($ip);
http_response_code(403);
echo json_encode(['error' => 'Sinulla ei ole oikeutta kirjautua tälle sivustolle.']);
break;
}
session_regenerate_id(true); session_regenerate_id(true);
$_SESSION['user_id'] = $u['id']; $_SESSION['user_id'] = $u['id'];
$_SESSION['username'] = $u['username']; $_SESSION['username'] = $u['username'];
$_SESSION['nimi'] = $u['nimi']; $_SESSION['nimi'] = $u['nimi'];
$_SESSION['role'] = $u['role']; $_SESSION['role'] = $u['role'];
// Multi-company: aseta käyttäjän yritykset sessioon
$userCompanies = $u['companies'] ?? [];
$_SESSION['companies'] = $userCompanies; $_SESSION['companies'] = $userCompanies;
// Domain-pohjainen oletusyritys
$host = strtolower(explode(':', $_SERVER['HTTP_HOST'] ?? '')[0]);
$domainCompany = dbGetCompanyByDomain($host);
$domainCompanyId = $domainCompany ? $domainCompany['id'] : '';
// Jos domain matchaa ja käyttäjällä on oikeus -> käytä sitä // Jos domain matchaa ja käyttäjällä on oikeus -> käytä sitä
if ($domainCompanyId && in_array($domainCompanyId, $userCompanies)) { if ($domainCompanyId && in_array($domainCompanyId, $userCompanies)) {
$_SESSION['company_id'] = $domainCompanyId; $_SESSION['company_id'] = $domainCompanyId;