Domain Access e Restrição de registo / login (só em alguns sites)

Events happening in the community are now at Drupal community events on www.drupal.org.
tjor's picture

Boas!

Estou a utilizar o módulo Domain Access para criar vários "sub-sites" e em alguns deles, só quem tiver um email de um certo formato é que se registar e entrar lá.

Todos os sites são "independentes": apesar dos conteúdos poderem aparecer em todos os os sites (independetemente de terem sido criados no site de base, no sub-site A, B ou C) e dos utilizadores poderem entrarem em contato entre eles por mensagem (independetemente de estarem registados no site de base, no sub-site A, B ou C), quem está registado no site de base (por exemplo) tem de registar-se noutro dos sub-sites para poder entrar (se ele tiver um email adequado em certos sub-sites...).

Ou seja, aquilo que preciso de fazer é:
- em "base.com": qualquer utilizador pode se registar
- em "a.base.com": qualquer utilizador pode se registar
- em "b.base.com": só quem tem um email "@b-site.com" (por exemplo) é que se pode registar.

Alguém sabe como fazer isso ?

Investiguei o módulo Domain Strict (que vem com o Domain Access) mas parece que aplicar a restrição de login a todos os sub-sites, não dá para escolher simultaneamente "livre registo para a.base.com" e "registo privado para b.base.com"... :(

Conhecem outro módulo ou outra maneira de chegar ao que se pretende??

Obrigado desde já por qualquer dica que possa resolver o problema ou pelo menos ajudar!!

Comments

Já tentas-te criar uma regra

uaparac's picture

Já tentas-te criar uma regra com o Rules? E despultas ação via Cron.

Já tentas-te criar uma regra

uaparac's picture

Já tentas-te criar uma regra com o Rules? E despultas ação via Cron.

Programaticamente podes

pauloamgomes's picture

Programaticamente podes faze-lo:

  1. implementas um hook_form_alter para o form de registro
  2. crias um element validate para o atributo mail
  3. na callback de validação validas o valor com o dominio

Ex:

<?php
function mymodule_form_user_register_form_alter(&$form, &$form_state) {
 
$form['account']['mail']['#element_validate'][] = 'mymodule_mail_domain_validate';
}
?>

<?php
function mymodule_mail_domain_validate($element, &$form_state, $form) {
 
$domain = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);

  switch (
$domain) {
    case
'a.base.com':
       
// something
       
break;
    case
'b.base.com':
        if (!
preg_match('/@.*b-site.com$/', $element['#value'])) {
         
form_set_error('mail', 'You are not allowed to register here');
        }
      break;
  }
?>

mymodule deve corresponder ao teu modulo.

Para evitares valores hardcoded podes criar uma settings page em que mapeias os dominios para uma whitelist de dominios de mail que sao aceites.

Rules e acessos a diferentes domínios?

tjor's picture

Olá !

Obrigado pela resposta.

Estás a falar de criar uma "rule" para cada domínio?
Não sabia que era possível...
Como é que se pode parametrizar numa "rule" que num site A entra-se "sem stress" e que num site B é preciso ter um formato email específico para entrar / registar-se?

Não gosto muito de fazer "adaptações" porque tenho sempre em mente que um módulo existente faz o que preciso (não devo ser o único no mundo que tentou fazer a mesma coisa com o Domain Access de certeza :) ) ... mas não encontrando "solução", tentei adaptar um pouco o código do módulo "Domain Strict" e até pode funcionar mas neste momento não é o caso por causa de um problema de Drupal que reparei agora só :S
-> o Drupal deixa um utilizador criar várias contas com o mesmo email :( (se o email usado for "chico@example.com" as diferentes contas vão ter o username "chico", "chico_1", "chico_2"... em vez de simplesmente ao utilizador "Este email já está associado a uma conta" !!)
Alguém já reparou / rectificou este problema?

Obviamente, caso existir um módulo que permite escolher o tipo de restrição de login - registo tal como indiquei no início, vou deixar de lado as modificações que tentei no Domain Strict... mas aquele problema de deixar registar contas com o mesmo email parece-me ser um caso sério que pode impactar a vários outros níveis (e acho pouco provável todos terem o mesmo problema!)...

Programaticamente

tjor's picture

Olá Paulo, só agora vi a tua resposta e exemplo de código, obrigado!

Não foi com "switch - case" (porque há outras cenas em ter em conta no meu código) mas foi mais ou menos isso que tentámos incluir na modificação do Domain Strict... e o problema agora é aquele que mencionei no último comentário:
"o Drupal deixa um utilizador criar várias contas com o mesmo email :( (se o email usado for "chico@b-site.com" as diferentes contas vão ter o username "chico", "chico_1", "chico_2"... em vez de simplesmente ao utilizador "Este email já está associado a uma conta" !!)"
Dessa maneira, no momento de verificar o "Assigned Domain" do utilizador (para ver se ele está registado no site B e deixá-lo fazer o login) o sistema pega no primeiro "chico@example.com" que encontra na lista de utilizadores e não considera outros, o que pode impedir um utilizador que já se ter registado primeiro no site de base de entrar com o mesmo email no site B.

Todos os sites Drupal têm esses problema?? (= possibilitar vários registos com o mesmo email)

Obrigado pela vossa ajuda mais uma vez.

Antes de mais evita sempre

pauloamgomes's picture

Antes de mais evita sempre fazer modificações em código de outros módulos ou core, o mecanismo de hooks é suficientemente flexivel para que não o precises de fazer.

Não percebo "o Drupal deixa um utilizador criar várias contas com o mesmo email"! Por defeito não podes registar 2 utilizadores com o mesmo mail, é uma condição base. Esta condição até pode ser quebrada (ex: https://www.drupal.org/project/sharedemail), mas por defeito não é possível.

Gostei da resposta do Paulo

uaparac's picture

Gostei da resposta do Paulo assim irá funcionar de certeza.
Contudo se não estiveres muito à vontade com o código podes tentar o seguinte. Se tiveres o Webform personaliza o form de registo do usar para o site que pretendes. Posto isto instala um modo acho que se chama #condition que te permite criar regras e condições ao preenchimento do formulário e podes disser que se o email nao fizer parte do domínio público que pretendes o formulário dá erro e não permite o registo.

Eu fugia da tentação de

pauloamgomes's picture

Eu fugia da tentação de seguir sempre o caminho "existe um módulo para..", pode ser verdade, mas na maioria das vezes o recurso a código de terceiros torna-se mais problema que solução.

Para coisas muito concretas e largamente testadas é obvio que se deve usar, mas coisas muito específicas, sobrecarregar o Drupal com mais um módulo , suportar a sua manutenção (tempo de configuração, aprendizagem, updates, bugfixes) não compensa.

Há que considerar o custo/beneficio de ambas as soluções.

Obrigado :)

tjor's picture

Vou investigar através dos pontos que levantaram, espero conseguir "chegar a bom porto"...

Thx novamente Paulo e "uaparac" !!