Restrição parcelar de acesso ao sistema

Saudações, família Scriptcase.
Estou o dia todo a trabalhar num sistema para criar restrição de acesso a determinados grupos do módulo de segurança.
Vou explicar o que pretendo que o sistema faça:
Imaginemos que uma escola estabeleça que as provas devam ser realizadas do dia data_um ao dia data_dois. Quando chegar o dia data_dois só os administrativos da escola e os administradores do sistema podem ter acesso.

Criei a seguinte lógica no evento onValidade:
if (sc_logged_is_blocked()) {
sc_error_exit();
}

$slogin = sc_sql_injection({login});
$spswd = sc_sql_injection(hash(“md5”, {pswd}));

$data_actual = new DateTime();

sc_lookup(rs, “SELECT duracao_dois FROM duracao_avaliacao WHERE id=(SELECT MAX(id) FROM duracao_avaliacao)”);
if (!empty({rs})) {
$data_limite = {rs[0][0]};
} else {
$data_limite = NULL;
}

$query = “SELECT group_id FROM sec_users_groups WHERE login = $slogin”; // Substitua 1 pelo ID do grupo administrativo no seu sistema
sc_lookup(rs, $query);
if (!empty({rs})) {
$grupo = {rs[0][0]};
} else {
// Se o contador for maior que zero, o usuário pertence ao grupo administrativo
$grupo = NULL;
}

//$grupo = getGrupo($slogin);
if ($data_actual > $data_limite) {
if ($grupo == 1 || $grupo == 5 || $grupo == 6) {
// Usuário pertence ao grupo administrativo, chefe de departamento ou liderados, permita o acesso completo.
sc_redir(‘menu’);
} else {
// Usuário não pertence a nenhum dos grupos permitidos, bloqueie o acesso.
// Redireciona para a página que avisa que o período já passou
sc_redir(‘blank_fim_avaliacao’);
}
} else {
// Horário de acesso ainda não expirou, permita o acesso normal.
sc_redir(‘menu’);
}

$sql = “SELECT
priv_admin,
active,
name,
email
FROM sec_users
WHERE login = $slogin
AND pswd = “.$spswd.””;

sc_lookup(rs, $sql);

if (count({rs}) == 0) {
    sc_log_add('login Fail', {lang_login_fail} . {login});
    sc_logged_in_fail({login});
    sc_error_message({lang_error_login});
} else if ({rs[0][1]} == 'Y') {
    $usr_login      = {login};
    $usr_priv_admin     = ({rs[0][0]} == 'Y') ? TRUE : FALSE;
    $usr_name       = {rs[0][2]};
    $usr_email      = {rs[0][3]};
    sc_set_global($usr_login);
    sc_set_global($usr_priv_admin);
    sc_set_global($usr_name);
    sc_set_global($usr_email);
	

} else {
    sc_error_message({lang_error_not_active});
    sc_error_exit();
}

O problema é que qualquer usuário ao tentar entrar cai à página que diz que o período expirou.
Obs.: Os grupos 1, 5 e 6 são que devem ter sempre acesso ao sistema.

Olá,
Para corrigir isso, basta inverter a ordem das verificações:

if ($data_actual > $data_limite) {
    return;
}

$grupo = getGrupo($slogin);

if ($grupo == 1 || $grupo == 5 || $grupo == 6) {
    sc_redir('menu');
} else {
    sc_error_message('Período de acesso expirado.');
    sc_error_exit();
}

Com essa alteração, a verificação da data limite só será feita se o usuário não pertencer a um dos grupos permitidos. Nesse caso, o usuário será redirecionado para a página de erro.

1 Curtida

Saudações, @joeltonsilva!
Com essa lógica, insiro o user e a senha, mas não permite o acesso nem dos admins nem dos que devem receber a mensagem do sc_error_message(). Apenas, limpa a senha e não apresenta mais nenhuma acção.

Abaixo, está o código completo no onValidate da app_Login:

$query = “SELECT CURDATE() FROM duracao_avaliacao”;
sc_lookup(rs, $query);

if(!empty({rs})){
$data_actual = {rs[0][0]};
}else{
$data_actual = null;
}

//$horarioLimite = new DateTime(‘15:00:00’); // Horário de encerramento
sc_lookup(rs, “SELECT duracao_dois FROM duracao_avaliacao WHERE id=(SELECT MAX(id) FROM duracao_avaliacao)”);
if(!empty({rs})){
$data_limite = {rs[0][0]};
//$data_actual = {rs[0][1]};
}else{
$data_limite = NULL;
//$data_actual = “”;
}

$quer = “SELECT group_id FROM sec_users_groups WHERE login = '”.[usr_login]."’";
sc_lookup(rs, $quer);
if(!empty({rs})){
$grupo = {rs[0][0]};
}else{
// Se o contador for maior que zero, o usuário pertence ao grupo administrativo
$grupo = NULL;
}

if($data_actual > $data_limite){
return;
}

//$grupo = getGrupo($slogin);

if($grupo == 1 || $grupo == 5 || $grupo == 6){
sc_redir(‘menu’);
}else{
sc_error_message(‘Período de acesso expirado.’);
sc_error_exit();
}

//Código default certo

if(sc_logged_is_blocked()) { sc_error_exit(); }

$slogin = sc_sql_injection({login});
$spswd = sc_sql_injection(hash(“md5”,{pswd}));

$sql = “SELECT
priv_admin,
active,
name,
email
FROM sec_users
WHERE login = $slogin
AND pswd = “.$spswd.””;

sc_lookup(rs, $sql);

if(count({rs}) == 0)
{
sc_log_add(‘login Fail’, {lang_login_fail} . {login});
sc_logged_in_fail({login});
sc_error_message({lang_error_login});
}
else if({rs[0][1]} == ‘Y’)
{
$usr_login = {login};
$usr_priv_admin = ({rs[0][0]} == ‘Y’) ? TRUE : FALSE;
$usr_name = {rs[0][2]};
$usr_email = {rs[0][3]};
sc_set_global($usr_login);
sc_set_global($usr_priv_admin);
sc_set_global($usr_name);
sc_set_global($usr_email);
}
else
{
sc_error_message({lang_error_not_active});
sc_error_exit();
}

Substitui o

if($data_actual > $data_limite){
return;
}

por:

if ($data_actual > $data_limite) {
  sc_error_message('Período de acesso expirado.');
  sc_error_exit();
}
1 Curtida

Alterei o código com a sua sugestão @joeltonsilva, mas não resultou.

Tirei o código do onValidade da app_Login, estou a utilizar no onValidateSuccess da mesma app, está a funcionar parcialmente. Se for alguém que pertença a um dos grupos(1, 5 e 6) acede o sistema com qualquer condição. Mas, os demais usuários nunca estão a aceder ao sistema mesmo quando $data_actual for menor do $data_limite. Por outro lado, ao invés de imprimir na tela o sc_error_message, eu redireciono o user para uma página quando o tempo estiver expirado.

Eis o código actualizado e que está a funcionar parcialmente:

$data_actual = new DateTime();

sc_lookup(rs, “SELECT duracao_dois FROM duracao_avaliacao WHERE id=(SELECT MAX(id) FROM duracao_avaliacao)”);
if (!empty({rs})) {
$data_limite = {rs[0][0]};
} else {
$data_limite = NULL;
}

$query = “SELECT group_id FROM sec_users_groups WHERE login =’”.[usr_login]."’"; // Substitua 1 pelo ID do grupo administrativo no seu sistema
sc_lookup(rs, $query);
if (!empty({rs})) {
$grupo = {rs[0][0]};
} else {
// Se o contador for maior que zero, o usuário pertence ao grupo administrativo
$grupo = NULL;
}
var_dump($grupo);
//$grupo = getGrupo($slogin);
if ($data_actual > $data_limite){
if( $grupo == 1 || $grupo == 5 || $grupo == 6){
// Usuário pertence ao grupo administrativo, chefe de departamento ou liderados, permita o acesso completo.
sc_redir(‘menu’);
} else {
// Usuário não pertence a nenhum dos grupos permitidos, bloqueie o acesso.
// Redireciona para a página que avisa que o período já passou
sc_redir(‘blank_fim_avaliacao’);
//sc_error_message(‘Período de acesso expirado.’);
//sc_error_exit();
}

} else if ($data_actual <= $data_limite){
// Horário de acesso ainda não expirou, permita o acesso normal.
sc_redir('menu');
}

sc_validate_success();