===== CAS =====
A autenticação na Intranet, é feita através do [[http://jasig.github.io/cas/|CAS (Central Authentication Service)]], em uma instalação que roda sobre o endereço [[https://cas.ufrj.br]], e é administrado pela Equipe de Administração de Servidores ([[mailto:adm.servidores@tic.ufrj.br|adm.servidores@tic.ufrj.br]]), mais especificamente pelo servidor Enoch Pimentel.
Como o CAS permite que sejam configurados vários backends de autenticação, na UFRJ o CAS aceita autenticação por LDAP ou por view no banco de dados SQL Server, embora a maior parte dos recursos seja destinados a pessoas autenticadas por uma view. Mais detalhes sobre essas views são explicados a seguir.
=== Views de Autenticação ===
Estas são as views utilizadas na autenticação via CAS. Todas elas ficam no banco de dados DBUFRJ.
== DBUFRJ.dbo.view_login_cas ==
Esta é a view configurada no CAS como principal backend. Os campo utilizados para autenticação são IdentificacaoUFRJ (que é o CPF ou passaporte, utilizado como nome de usuário) e SenhaSHA, que é um hash SHA1 da senha do usuário. O CAS está ainda configurado para retornar ao cliente os campos Nome, Email e grupos, de onde são tirados dados para controle de permissões. O campo grupo é uma concatenação dos grupos aos quais o usuário pertence dentro dos sistemas corporativos, separados por dois pontos (“:”). Os grupos podem ser “aluno_grad” (aluno de graduação), “aluno_pos” (aluno de pós graduação), “docente”, “tec_admin” (técnico administrativo) ou outros grupos definidos no cadastro de acesso especial.
As senhas dos usuários, fornecidas por esta view, ficam armazenadas na tabela **dbo.SenhaLDAP**, do DBUFRJ.
Segue abaixo o código desta view, extraído em 11/01/2016:
CREATE VIEW [dbo].[view_login_cas]
AS
SELECT DISTINCT
P.Nome,
P.Email,
CASE
WHEN VT.MatriculaSiape IS NOT NULL THEN VT.MatriculaSiape
WHEN VP.MatriculaSiape IS NOT NULL THEN VP.MatriculaSiape
END AS matricula_siape,
CASE
WHEN VAG.registroSIRA IS NOT NULL THEN VAG.registroSIRA
WHEN VAP.registroSIRA IS NOT NULL THEN VAP.registroSIRA
END AS registro_sira,
SUBSTRING(
CASE WHEN (VT.ativo IS NOT NULL) THEN ':tecnico_admin' ELSE '' END
+ CASE WHEN (VAG.ativo IS NOT NULL) THEN ':aluno_graduacao' ELSE '' END
+ CASE WHEN (VAP.ativo IS NOT NULL) THEN ':aluno_pos' ELSE '' END
+ CASE WHEN (VP.ativo IS NOT NULL) THEN ':docente' ELSE '' END
+ CASE WHEN (UE.grupos IS NOT NULL) THEN ':' + CONVERT(VARCHAR(100),UE.grupos) ELSE '' END
, 2, 1024) AS grupos,
VT.Ativo AS eh_tec_admin,
VAG.ativo AS eh_aluno_grad,
VAP.ativo AS eh_aluno_pos,
VP.Ativo AS eh_professor,
S.IdentificacaoUFRJ,
S.SenhaSHA,
S.SenhaSSHA,
CASE
WHEN 1 IN (VT.ativo, VAG.ativo, VAP.ativo, VP.ativo) THEN 1 ELSE 0
END AS ativo
FROM
dbo.SenhaLDAP AS S
INNER JOIN
dbo.Pessoa AS P ON P.IdentificacaoUFRJ = S.IdentificacaoUFRJ
LEFT OUTER JOIN dbo.view_eh_tec_adm AS VT ON VT.IdentificacaoUFRJ = S.IdentificacaoUFRJ
LEFT OUTER JOIN dbo.view_eh_aluno_grad AS VAG ON VAG.IdentificacaoUFRJ = S.IdentificacaoUFRJ
LEFT OUTER JOIN dbo.view_eh_aluno_pos AS VAP ON VAP.IdentificacaoUFRJ = S.IdentificacaoUFRJ
LEFT OUTER JOIN dbo.view_eh_professor AS VP ON VP.IdentificacaoUFRJ = S.IdentificacaoUFRJ
LEFT JOIN IntranetUFRJ.dbo.UsuariosAcessoEspecial UE ON(
UE.IdentificacaoUFRJ = P.IdentificacaoUFRJ
AND (
(
UE.data_inicio IS NULL
OR UE.data_inicio <= GETDATE()
)
AND (
UE.data_fim IS NULL
OR UE.data_fim >= GETDATE()
)
)
)
A view_login_cas se utiliza de outras views que já eram utilizadas pela versão antiga da Intranet, que são a view_eh_professor, view_eh_aluno_grad, view_eh_aluno_pos e view_eh_tec_adm, melhor comentada a seguir.
== DBUFRJ.dbo.view_eh_aluno_grad ==
Esta view é responsável por identificar os alunos matriculados em cursos de graduação.
Segue abaixo o código da view, extraído em 12/01/2016:
CREATE VIEW [dbo].[view_eh_aluno_grad]
AS
SELECT
pf.IdentificacaoUFRJ, a.matriculaDRE AS registroSIRA, CASE WHEN sm.codigo LIKE 'A%' THEN 1 ELSE 0 END AS ativo, c.nome, p.Email
FROM
Siga.dbo.Aluno AS a INNER JOIN
Siga.dbo.Curso AS c ON c.curso_oid = a.curso_oid INNER JOIN
dbo.PessoaFisica AS pf ON a.pessoaFisica_oid = pf.PessoaFisica_Oid INNER JOINdbo.Pessoa AS p ON p.Pessoa_oid = pf.pessoa_oid INNER JOIN
Siga.dbo.TipoNivel AS tn ON a.tipoNivel_oid = tn.tipoNivel_oid INNER JOIN
Siga.dbo.SituacaoMatricula AS sm ON a.situacaoMatricula_oid = sm.situacaoMatricula_oid
(tn.codigo = '3')
WHERE
GO
DBUFRJ.dbo.view_eh_aluno_pos
Esta view é responsável por identificar os alunos matriculados em cursos de pós-graduação. Segue abaixo o código da view, extraído em 12/01/2016:
CREATE VIEW [dbo].[view_eh_aluno_pos]
AS
SELECT
pf.IdentificacaoUFRJ, a.matriculaDRE AS registroSIRA, CASE WHEN sm.codigo LIKE 'A%' THEN 1 ELSE 0 END AS ativo, c.nome, p.Email
FROM
Siga.dbo.Aluno AS a INNER JOIN
Siga.dbo.Curso AS c ON c.curso_oid = a.curso_oid INNER JOIN
dbo.PessoaFisica AS pf ON a.pessoaFisica_oid = pf.PessoaFisica_Oid INNER JOIN
dbo.Pessoa AS p ON p.Pessoa_oid = pf.pessoa_oid INNER JOIN
Siga.dbo.TipoNivel AS tn ON a.tipoNivel_oid = tn.tipoNivel_oid INNER JOIN
Siga.dbo.SituacaoMatricula AS sm ON a.situacaoMatricula_oid = sm.situacaoMatricula_oid
WHERE
(tn.codigo <> '3')
GO
== DBUFRJ.dbo.view_eh_professor ==
Esta view é responsável por identificar os servidores docentes. Segue abaixo o código da view, extraído em 12/01/2016:
CREATE VIEW [dbo].[view_eh_professor]
AS
SELECT DISTINCT
su.IdentificacaoUFRJ,
su.MatriculaSiape,
CASE (UltimoRegimeJuridico + UltimaSituacaoFuncional) WHEN 'EST01' THEN 1 WHEN 'EST02' THEN 0 ELSE 0 END AS Ativo,
l.DescricaoLocal,
p.Email
FROM
dbo.ServidorUfrj AS su
INNER JOIN dbo.Local AS l ON l.CodigoLocal = su.UltimaLocalizacao AND l.AnoPagamento = YEAR(GETDATE()) AND l.MesPagamento = MONTH(GETDATE())
INNER JOIN dbo.Pessoa AS p ON p.IdentificacaoUFRJ = su.IdentificacaoUFRJ
WHERE
(
su.CodigoGrupo IN('705' , '706', '707')
OR (
su.CodigoGrupo = '060'
AND su.CodigoCargo IN('002','003')
)
) AND (su.ExclusaoData IS NULL)
GO
== DBUFRJ.dbo.view_eh_tec_adm ==
Esta view é responsável por identificar os servidores técnicos administrativos.
Segue abaixo o código da view, extraído em 12/01/2016:
CREATE VIEW [dbo].[view_eh_tec_adm]
AS
SELECT DISTINCT
su.IdentificacaoUFRJ, su.MatriculaSiape, CASE (su.UltimoRegimeJuridico + su.UltimaSituacaoFuncional)
WHEN 'EST01' THEN 1 WHEN 'EST08' THEN 1 WHEN 'EST02' THEN 0 ELSE 0 END AS Ativo, l.DescricaoLocal, p.Email
FROM
dbo.ServidorUfrj AS su INNER JOIN
dbo.Local AS l ON l.CodigoLocal = su.UltimaLocalizacao AND l.AnoPagamento = YEAR(GETDATE()) AND l.MesPagamento = MONTH(GETDATE()) INNE
dbo.Pessoa AS p ON p.IdentificacaoUFRJ = su.IdentificacaoUFRJ
WHERE
su.CodigoGrupo = '701' AND (su.ExclusaoData IS NULL)
GO
== Acesso Especial ==
Além das views legadas, a estrutura da Intranet permite ainda incluir manualmente mais grupos a serem retornados pela **view_login_cas**. Para fazê-lo, basta incluir um registro por pessoa na tabela **dbo.UsuariosAcessoEspecial**, que fica no banco de dados IntranetUFRJ. Os campos devem ser preenchidos da seguinte forma:
* IdentificacaoUFRJ - CPF (ou passaporte iniciado pela letra “E”) do usuário;
* grupos - Grupos adicionais para o usuário, separados por dois pontos (“:”);
* data_inicio (opcional) - Data de início da validade dos grupos para o usuário;
* data_fim (opcional) - Data fim da validade dos grupos para o usuário;
* obs - Observações. É importante preencher este campo para explicar o que motivou a inclusão manual do(s) grupo(s).
Todos os usuários incluídos nesta tabela ganham todos os acessos garantidos para os grupos definidos, sendo eles repassados pelo CAS. Esse acesso também fica restrito aos períodos compreendidos entre as datas definidas entre os campos data_incio e data_fim. Se um ou nenhum dos campos for preenchido, será considerado que o acesso não terá limite para início e/ou fim.