Eu tenho um requisito onde, eu tenho que substituir a autenticação do usuário padrão pela autenticação de um servidor central, ou seja, servidor SSO.
Ao depurar o Drupal, fiquei sabendo que todo o gerenciamento de sessões acontece em includes/session.inc
arquivo. Quero fazer a autenticação, como mostrado na imagem:
CENÁRIO: Login
Os detalhes das etapas seriam:
- Substitua o formulário de login para enviar o nome de usuário e a senha ao servidor SSO ( não no Drupal , mas no .NET).
- Autentique o usuário no servidor SSO usando o banco de dados desse site; e envie uma resposta de volta para alguma página PHP personalizada do meu site (ou um formulário de um módulo?).
- Usando a resposta, identifique o usuário na tabela de usuários e crie uma sessão para esse usuário sem verificar a senha (pois isso significaria autenticação dupla). Por padrão, o Drupal define um cookie com o nome da
$insecure_session_name
variável e com o valor$sid
. Quero que o Drupal não defina o cookie aqui, envie os valores das variáveis para o servidor SSO. - O servidor SSO pegará os valores, criará um cookie e o descartará no domínio principal
domain.com
(para lembrar os doismy website
esso server
está no subdomínio do domínio principal, que também não está no Drupal). Em seguida, o site drupal pode efetuar login usando esse cookie.
Eu sei que é uma pergunta difícil, só estou procurando indicações sobre como devo começar? como se costuma dizer "você não deve invadir o núcleo". Então, minhas perguntas são:
- Onde devo procurar para entender como a autenticação e o gerenciamento de sessões do Drupal funcionam em profundidade?
- Existe uma maneira de chamar as funções
includes/session.inc
usando ganchos (como os comentários com funções dizem "apenas para uso interno / não devem ser modificados")?
NOTA: Vou usar o mesmo método para registrar o usuário, para que o registro permaneça no banco de dados central do servidor SSO. E durante isso, você inserirá uma senha indesejada para o mesmo usuário no banco de dados do site Drupal (pois a senha não será verificada durante o login).
Respostas:
Drupal suporta autenticação externa . Existem muitas alternativas de módulos de autenticação para o Drupal, como OpenID (incluído no núcleo), OAuth Connector ou LDAP . Saiba mais sobre como a autenticação Drupal funciona; o melhor seria examinar os módulos OpenID e OAuth e enviar o retorno de chamada ao formulário de login principal. Mas, AFAIK, eles sempre iniciam a sessão normal do Drupal após uma autenticação bem-sucedida.
Para gerenciamento de sessões, o Drupal se conecta ao tratamento de sessões PHP e registra seus próprios manipuladores. A sessão backend Drupal é a própria pluggable, você pode definir a
session_inc
variável para o caminho de um arquivo fornecendo implementações alternativas das funções encontradas emincludes/session.inc
. O módulo memcache usa isso para armazenar a sessão no memcached.Para referências, o módulo OpenID lida com a autenticação bem-sucedida na
openid_authentication()
qual ele cessa e chama o manipulador de envio do formulário de login do usuário (ou seja,user_login_submit()
). Esse manipulador de envio em si é simples, carrega o usuário autenticado com êxitouser_load()
na$user
variável global e, em seguida, chamauser_login_finalize()
qual manipula sessão, efetua o registro de datauser
e hora na tabela e invocahook_user_login()
implementações.Outra opção é usar a
user_external_login_register()
função A função fará logon em um usuário externo. Também cria um usuário local, se necessário. Se você precisar de mais controle sobre a criação do usuário local, você sempre pode usaruser_save()
,user_set_authmaps()
,user_login_submit()
euser_external_load()
de você chamar costume, usandouser_external_login_register()
como modelo do que precisa ser feito.fonte
A APi user_authenticate () pode ser útil aqui.
EDIT: Quando o servidor SSO retornar com true, use esta API para efetuar login no usuário, que cuidará automaticamente das sessões para você. Eu acho que é melhor se você usar em
user_authenticate()
vez de criar sessões sozinho. Ele não deve causar problemas, mesmo que seja uma autenticação dupla, desde que seja fornecida uma senha válida.Não tenho certeza de 4. Deseja que o cookie fique visível nos dois domínios? Nesse caso, em settings.php inicialize
$cookie_domain
no domínio. Em seguida, os cookies no subsite estarão disponíveis no site pai.fonte
user_authenticate
porque, a autenticação não precisa acontecer no site Drupal. Eu posso gerar a sessão chamandodrupal_session_generate()
edrupal_session_regenerate()
do arquivo session.inc. Você acertou no requisito do cookie. Consulte a edição.