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:
18
api.php
18
api.php
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user