cmpa_auth 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +15 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +131 -0
- data/app/controllers/sessions_controller.rb +48 -0
- data/app/helpers/sessions_helper.rb +16 -0
- data/app/views/errors/error_403.html.erb +1 -0
- data/app/views/layouts/sessions.html.erb +48 -0
- data/app/views/sessions/index.html.erb +5 -0
- data/app/views/sessions/new.html.erb +18 -0
- data/app/views/sessions/selecao_lotacao_temporaria.html.erb +6 -0
- data/config/config.yml +7 -0
- data/config/routes.rb +5 -0
- data/init.rb +1 -0
- data/lib/cmpa_auth/access_denied.rb +7 -0
- data/lib/cmpa_auth/authentication.rb +25 -0
- data/lib/cmpa_auth/extensions.rb +36 -0
- data/lib/cmpa_auth/models/estagiario.rb +6 -0
- data/lib/cmpa_auth/models/funcionario.rb +6 -0
- data/lib/cmpa_auth/models/grupo_acesso.rb +17 -0
- data/lib/cmpa_auth/models/lotacao_temporaria.rb +82 -0
- data/lib/cmpa_auth/models/pessoa.rb +26 -0
- data/lib/cmpa_auth/models/setor.rb +17 -0
- data/lib/cmpa_auth/models/sistema.rb +18 -0
- data/lib/cmpa_auth/portal_connection.rb +21 -0
- data/lib/cmpa_auth/rails_helpers.rb +56 -0
- data/lib/cmpa_auth.rb +22 -0
- data/public/images/sistemas/administrativo.png +0 -0
- data/public/images/sistemas/agenda.png +0 -0
- data/public/images/sistemas/aviso.png +0 -0
- data/public/images/sistemas/central_transportes.png +0 -0
- data/public/images/sistemas/controle_acesso.png +0 -0
- data/public/images/sistemas/convenios.png +0 -0
- data/public/images/sistemas/cotas.png +0 -0
- data/public/images/sistemas/cursos_eventos.png +0 -0
- data/public/images/sistemas/dados_pessoais.png +0 -0
- data/public/images/sistemas/efetividade.png +0 -0
- data/public/images/sistemas/formulario.png +0 -0
- data/public/images/sistemas/helpdesk.png +0 -0
- data/public/images/sistemas/movimentacao_pessoal.png +0 -0
- data/public/images/sistemas/ouvidoria.png +0 -0
- data/public/images/sistemas/pesquisa.png +0 -0
- data/public/images/sistemas/pesquisa_organizacional.png +0 -0
- data/public/images/sistemas/processo_eletronico.png +0 -0
- data/public/images/sistemas/qbm.png +0 -0
- data/public/images/sistemas/seguranca.png +0 -0
- data/public/images/sistemas/sms.png +0 -0
- data/public/images/sistemas/telefonia.jpg +0 -0
- data/public/images/sistemas/telephone.png +0 -0
- data/public/images/sistemas/video.png +0 -0
- data/rails/init.rb +1 -0
- metadata +105 -0
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
== 1.0.2 released 2009-11-08
|
2
|
+
|
3
|
+
* Documenta��o melhorada.
|
4
|
+
* Atualiza��o do m�todo <tt>LotacaoTemporaria#method_missing</tt> para que ele
|
5
|
+
defina os m�todos que n�o existirem e que comecem por <i>in_groups_of</i> ou
|
6
|
+
<i>role_of</i>.
|
7
|
+
|
8
|
+
== 1.0.1 released 2009-11-05
|
9
|
+
|
10
|
+
* Melhorias na documenta��o e cria��o do README.
|
11
|
+
* Remo��o dos m�todos <tt>CmpaAuth::Authentication.in_group?</tt> e <tt>CmpaAuth::Authentication.in_groups?</tt>
|
12
|
+
|
13
|
+
== 1.0.0 released 2009-09-10
|
14
|
+
|
15
|
+
* Primeiro release
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 CMPA Câmara Municipal de Porto Alegre - Assessoria de Informática
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
== CmpaAuth
|
2
|
+
|
3
|
+
Biblioteca de autentica��o para a Assessoria de Inform�tica (C�mara Municipal de
|
4
|
+
Porto Alegre).
|
5
|
+
|
6
|
+
Quando a aplica��o for inicializada uma s�rie de coisas estar� dispon�vel.
|
7
|
+
|
8
|
+
* Controllers
|
9
|
+
- ApplicationController: respons�vel pela autentica��o, redirecionamento de
|
10
|
+
exce��es e implementa��o de alguns helpers (ex.: logged_in?, current_user,
|
11
|
+
etc)
|
12
|
+
- SessionsController: respons�vel pela exibi��o das telas de login e
|
13
|
+
lota��es tempor�rias. Tamb�m respons�vel pelo logout.
|
14
|
+
* Views
|
15
|
+
- Layouts: um layout gen�rico � utilizado para a autentica��o e para a
|
16
|
+
sele��o de lota��es tempor�rias.
|
17
|
+
- Errors: cont�m telas com mensagens de erro. Atualmente com suporte ao erro
|
18
|
+
403 (forbidden).
|
19
|
+
* Routes
|
20
|
+
- Um resource padr�o para uma session. Na se��o "Exemplos de Uso" h� uma
|
21
|
+
descri��o dessas rotas e como utiliz�-las.
|
22
|
+
* Public
|
23
|
+
- Uma pasta (sistemas) ser� copiada para a pasta <i>public/images</i> da
|
24
|
+
aplica��o contendo as imagens de cada sistema.
|
25
|
+
|
26
|
+
|
27
|
+
== Exemplos de Uso
|
28
|
+
|
29
|
+
=== Configura��o
|
30
|
+
|
31
|
+
No arquivo <i>config/environment.rb</i> adicione a seguinte linha de c�digo no
|
32
|
+
bloco de inicializa��o:
|
33
|
+
|
34
|
+
config.gem 'cmpa_auth'
|
35
|
+
|
36
|
+
Observe que o Rails avisar� caso a gem cmpa_auth n�o esteja instalada,
|
37
|
+
entretanto n�o ser� capaz de instal�-la. No momento voc� deve copiar a �ltima
|
38
|
+
vers�o da gem dispon�vel em <i>\\\\cmpa-s01\info\desenvolvimento\gems</i> para o
|
39
|
+
seu computador e rodar o comando abaixo.
|
40
|
+
|
41
|
+
$ sudo gem install --local path/to/gem/cmpa_auth-x.x.x.gem
|
42
|
+
|
43
|
+
|
44
|
+
=== Models
|
45
|
+
|
46
|
+
Para tornar as nossas vidas mais simples, n�o � preciso criar os modelos abaixo.
|
47
|
+
Caso eles j� tenham sido declarados na aplica��o os seus m�todos/constantes
|
48
|
+
ser�o "mesclados".
|
49
|
+
|
50
|
+
* Estagiario
|
51
|
+
* Funcionario
|
52
|
+
* GrupoAcesso
|
53
|
+
* LotacaoTemporaria
|
54
|
+
* Pessoa
|
55
|
+
* Setor
|
56
|
+
* Sistema
|
57
|
+
|
58
|
+
|
59
|
+
=== Controllers e Views
|
60
|
+
|
61
|
+
Nesse momento voc� j� � capaz de utilizar todas as funcionalidades do cmpa_auth.
|
62
|
+
Vamos supor que voc� queira perguntar se o usu�rio est� logado. Simples, utilize
|
63
|
+
o helper <tt>logged_in?</tt>. Para pegar o usu�rio logado, o qual � do tipo
|
64
|
+
<tt>Pessoa</tt> ou a lota��o tempor�ria que ele escolheu ao entrar no sistema,
|
65
|
+
utilize, respectivamente, os helpers <tt>current_user</tt> e
|
66
|
+
<tt>current_lotacao</tt>.
|
67
|
+
|
68
|
+
Para saber se a lota��o atual est� no grupo de acesso SUPER, voc� pode perguntar:
|
69
|
+
|
70
|
+
current_lotacao.role_of_super?
|
71
|
+
|
72
|
+
Ou se quiser saber se a lota��o atual est� nos grupo de acesso <tt>SUPER</tt>
|
73
|
+
e/ou no grupo de acesso <tt>REDATOR</tt>, pergunte:
|
74
|
+
|
75
|
+
current_lotacao.role_of_super_and_redator?
|
76
|
+
current_lotacao.role_of_super_or_redator?
|
77
|
+
|
78
|
+
O importante � notar que esses m�todos s�o criados atrav�s de
|
79
|
+
<tt>method_missing</tt> e, portanto, para utiliz�-los voc� deve seguir algumas
|
80
|
+
regras.
|
81
|
+
|
82
|
+
* Chamar um m�todo que comece com <i>in_groups_of</i> / <i>role_of</i> e termine
|
83
|
+
com um ponto de interroga��o.
|
84
|
+
* Os grupos de acesso s�o os nomes separados por um <i>and</i> ou por um
|
85
|
+
<i>or</i> (n�o ambos). � feito um upcase em cada um desses grupos, ou seja, no
|
86
|
+
banco de dados esses nomes devem estar em caixa alta.
|
87
|
+
Exemplo:
|
88
|
+
|
89
|
+
# � uma chamada inv�lida, pois n�o h� como saber se queremos testar
|
90
|
+
# "SUPER" && ("REDATOR" || "EDITOR") ou se queremos testar
|
91
|
+
# ("SUPER" && "REDATOR") || "EDITOR"
|
92
|
+
current_lotacao.role_of_super_and_redator_or_editor?
|
93
|
+
|
94
|
+
Uma boa pr�tica � criar um helper para esse teste e n�o ficar fazendo a mesma
|
95
|
+
chamada repetidas vezes... Por exemplo, no <tt>ApplicationController</tt>.
|
96
|
+
|
97
|
+
helper_method :redator?, :fotografo?
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def redator?
|
102
|
+
current_lotacao.in_groups_of_super_and_redator?
|
103
|
+
end
|
104
|
+
|
105
|
+
def fotografo?
|
106
|
+
current_lotacao.in_groups_of_super_and_fotografo?
|
107
|
+
end
|
108
|
+
|
109
|
+
Ent�o na view podemos perguntar:
|
110
|
+
|
111
|
+
- if fotografo? || redator?
|
112
|
+
...
|
113
|
+
|
114
|
+
|
115
|
+
=== Routes, Login e Logout
|
116
|
+
|
117
|
+
Como o cmpa_auth utiliza a capacidade do Rails de trabalhar com engines, voc�
|
118
|
+
tem acesso autom�tico a algumas rotas para realizar as opera��es de login e
|
119
|
+
logout.
|
120
|
+
|
121
|
+
Para realizar logout e supondo que o usu�rio j� esteja logado, voc� pode
|
122
|
+
oferecer o seguinte link na view:
|
123
|
+
|
124
|
+
= link_to 'sair', session_path, :method => :delete
|
125
|
+
|
126
|
+
O login � feito automaticamente caso o usu�rio n�o esteja logado. Isso � feito
|
127
|
+
atrav�s do before filter <tt>check_authentication</tt> que por sua vez utiliza o
|
128
|
+
helper <tt>logged_in?</tt>.
|
129
|
+
|
130
|
+
|
131
|
+
Copyright (c) 2009 CMPA - Assessoria de Inform�tica
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class SessionsController < ApplicationController
|
2
|
+
|
3
|
+
before_filter :check_authentication, :only => :index
|
4
|
+
|
5
|
+
def index
|
6
|
+
@sistemas = CmpaAuth::Authentication.allowed_systems(session[:lotacao_temporaria_id]).sort_by(&:nome)
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
redirect_to root_url if session[:lotacao_temporaria_id]
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
user = CmpaAuth::Authentication.authenticate(params[:login], params[:password])
|
15
|
+
if user
|
16
|
+
session[:current_user_id] = user.id
|
17
|
+
lotacoes_ativas = user.lotacoes_temporarias_ativas
|
18
|
+
if lotacoes_ativas.size == 1
|
19
|
+
session[:lotacao_temporaria_id] = lotacoes_ativas.first.id
|
20
|
+
redirect_to root_url
|
21
|
+
elsif lotacoes_ativas.many?
|
22
|
+
redirect_to selecao_lotacao_temporaria_url(user.id)
|
23
|
+
else
|
24
|
+
flash.now[:error] = "Você não possui lotacões temporárias. Por favor, entre em contato com a Assessoria de Informática"
|
25
|
+
render :new
|
26
|
+
end
|
27
|
+
else
|
28
|
+
flash.now[:error] = "Usuário e/ou senha incorretos!"
|
29
|
+
render :new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy
|
34
|
+
reset_session
|
35
|
+
flash[:notice] = "Logout efetuado!"
|
36
|
+
redirect_to new_session_url
|
37
|
+
end
|
38
|
+
|
39
|
+
def selecao_lotacao_temporaria
|
40
|
+
if params[:lotacao_selecionada]
|
41
|
+
session[:lotacao_temporaria_id] = params[:pessoa_id]
|
42
|
+
redirect_to root_url
|
43
|
+
else
|
44
|
+
user = Pessoa.find(params[:pessoa_id])
|
45
|
+
@lotacoes_temporarias = user.lotacoes_temporarias_ativas
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SessionsHelper
|
2
|
+
|
3
|
+
def link_sistema(sistema_id, options = {}, html_options = {})
|
4
|
+
sistema = Sistema.find(sistema_id)
|
5
|
+
|
6
|
+
url_options = {
|
7
|
+
:port => Rails.env == 'development' ? (sistema.porta.to_i - 1000) : sistema.porta,
|
8
|
+
:host => Rails.env == 'development' ? "#{ENV['COMPUTERNAME']}.#{ENV['USERDNSDOMAIN']}" : sistema.host,
|
9
|
+
:controller => sistema.url
|
10
|
+
}
|
11
|
+
|
12
|
+
options[:class] = "#{options[:class]} icon-sistema icon-#{sistema.image_name.gsub(/\.(png|gif)/, '')}"
|
13
|
+
|
14
|
+
link_to sistema.nome.capitalize, "http://#{url_options[:host]}:#{url_options[:port]}#{url_options[:controller]}", options, html_options
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1>403 Forbidden</h1>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>PortalCMPA - Gerenciamento de Acesso</title>
|
5
|
+
<%= stylesheet_link_tag 'application' %>
|
6
|
+
<%= javascript_include_tag 'jquery' %>
|
7
|
+
|
8
|
+
<script type="text/javascript">
|
9
|
+
jQuery(function($) {
|
10
|
+
$('#focus').focus();
|
11
|
+
$('#menu > li:first-child a').addClass('selected');
|
12
|
+
});
|
13
|
+
</script>
|
14
|
+
</head>
|
15
|
+
<body>
|
16
|
+
<% if logged_in? %>
|
17
|
+
<div id='header'>
|
18
|
+
<ul id='menu'>
|
19
|
+
<li><%= link_to 'Gerenciamento de Acesso' %></li>
|
20
|
+
</ul>
|
21
|
+
<div class='login'>
|
22
|
+
<p>
|
23
|
+
<strong><%= current_user.usuario %></strong> |
|
24
|
+
<%= link_to "sair", session_url, :method => :delete, :class => 'icon icon-door-out' %>
|
25
|
+
</p>
|
26
|
+
<em><%= current_lotacao.setor.nome %></em>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
<% end %>
|
30
|
+
<div id='container'>
|
31
|
+
<div id='main'>
|
32
|
+
<div class='flash'>
|
33
|
+
<% flash.each_pair do |k, v| %>
|
34
|
+
<%= content_tag :div, v, :class => k %>
|
35
|
+
<% end %>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<%= yield %>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
<% if logged_in? %>
|
42
|
+
<div id='footer'>
|
43
|
+
© Assessoria de Informática CMPA |
|
44
|
+
<%= link_to "sair", session_url, :method => :delete %>
|
45
|
+
</div>
|
46
|
+
<% end %>
|
47
|
+
</body>
|
48
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class='form' style='width:40em'>
|
2
|
+
<h3>Área restrita. Por favor, efetue login.</h3>
|
3
|
+
<% form_tag session_path, :id => 'login' do %>
|
4
|
+
<p>
|
5
|
+
<%= label_tag :login, 'Usuário:' %>
|
6
|
+
<%= text_field_tag :login, params[:login], :size => 20, :id => 'focus' %>
|
7
|
+
</p>
|
8
|
+
|
9
|
+
<p>
|
10
|
+
<%= label_tag :password, 'Senha:' %>
|
11
|
+
<%= password_field_tag :password, params[:password], :size => 20 %>
|
12
|
+
</p>
|
13
|
+
|
14
|
+
<ul>
|
15
|
+
<li><%= submit_tag 'Entrar' %></li>
|
16
|
+
</ul>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<h2 class='title'>Olá <%= current_user.usuario %>, selecione o setor pelo qual você deseja operar o sistema</h2>
|
2
|
+
<ul class='list'>
|
3
|
+
<% @lotacoes_temporarias.each do |lt| %>
|
4
|
+
<li><%= link_to lt.setor.nome, selecao_lotacao_temporaria_path(lt.id, :lotacao_selecionada => :sim) %></li>
|
5
|
+
<% end %>
|
6
|
+
</ul>
|
data/config/config.yml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
development:
|
2
|
+
session_key: _camarapoa
|
3
|
+
secret: 6d3fb2a0cd7a049e27f77c8ca73fd590552776e47de47e3c7a44638bd4ab8add7140c11edd892a4d9d019d643a068c88d1a30c72b544b453ccdd8774a17ac589112081c779f51834a567314b95a0cdda01fe977b16440b721f6fde71ce0130b70c5bf90d1066bdef4e5ec08dca457522b0b399cf4567603b377efb28f701fc78
|
4
|
+
|
5
|
+
production:
|
6
|
+
session_key: _camarapoa
|
7
|
+
secret: 6d3fb2a0cd7a049e27f77c8ca73fd590552776e47de47e3c7a44638bd4ab8add7140c11edd892a4d9d019d643a068c88d1a30c72b544b453ccdd8774a17ac589112081c779f51834a567314b95a0cdda01fe977b16440b721f6fde71ce0130b70c5bf90d1066bdef4e5ec08dca457522b0b399cf4567603b377efb28f701fc78
|
data/config/routes.rb
ADDED
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'cmpa_auth'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
module Authentication
|
3
|
+
|
4
|
+
CLASS_NAMES = %w( Pessoa Estagiario Funcionario GrupoAcesso LotacaoTemporaria Setor Sistema )
|
5
|
+
|
6
|
+
#
|
7
|
+
# Realiza a autentica��o e retorna uma pessoa (usu�rio) caso o login e senha
|
8
|
+
# estejam corretos.
|
9
|
+
#
|
10
|
+
def self.authenticate(login, password)
|
11
|
+
user = ::Pessoa.first(:conditions => { :usuario => login })
|
12
|
+
user if user && login.present? && password.present? && Digest::SHA256.hexdigest(password + user.senha_salt) == user.senha_hash
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# Retorna uma lista de sistemas dispon�veis para a lota��o tempor�ria em quest�o.
|
17
|
+
#
|
18
|
+
def self.allowed_systems(lotacao_temporaria_id)
|
19
|
+
lotacao_temporaria = ::LotacaoTemporaria.find(lotacao_temporaria_id)
|
20
|
+
lotacao_temporaria.grupos_acesso.inject([]) do |sistemas, grupo|
|
21
|
+
sistemas += grupo.sistemas.select { |s| !sistemas.include?(s) && s.status == 'ativo' }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
|
3
|
+
# Constr�i uma lista de modelos que j� existem na aplica��o.
|
4
|
+
implemented_klasses = Authentication::CLASS_NAMES.select do |klass|
|
5
|
+
File.exists? File.join(Rails.root, 'app', 'models', klass.underscore + '.rb')
|
6
|
+
end
|
7
|
+
|
8
|
+
# Este bloco ser� executado de duas formas distintas:
|
9
|
+
# * Em desenvolvimento ser� executado cada vez que a aplica��o for recarregada (a cada novo request)
|
10
|
+
# * Em produ��o ser� chamado somente uma vez para cada um dos modelos (assim que a aplica��o for inicializada)
|
11
|
+
::ActionController::Dispatcher.to_prepare do
|
12
|
+
Authentication::CLASS_NAMES.each do |klass|
|
13
|
+
|
14
|
+
# M�dulo correspondente a classe em quest�o. e.g.: classe Pessoa, m�dulo CmpaAuth::Models::Pessoa.
|
15
|
+
module_const = "CmpaAuth::Models::#{klass}".constantize
|
16
|
+
|
17
|
+
if implemented_klasses.include? klass
|
18
|
+
klass.constantize.send(:include, module_const)
|
19
|
+
|
20
|
+
# O modelo n�o foi definido na aplica��o, ent�o deve-se cri�-lo dinamicamente
|
21
|
+
else
|
22
|
+
# Descobre qual a superclasse do modelo. Funcion�rio e Estagi�rio tem como superclasse a classe Pessoa.
|
23
|
+
superclass = %w[Estagiario Funcionario].include?(klass) ? ::Pessoa : ActiveRecord::Base
|
24
|
+
|
25
|
+
klass_const = Class.new(superclass)
|
26
|
+
|
27
|
+
# Para se evitar warnings no console no ambiente de desenvolvimento, remove-se o "nome"
|
28
|
+
# da classe antes de set�-la novamente.
|
29
|
+
Object.send(:remove_const, klass) if Object.const_defined?(klass)
|
30
|
+
Object.const_set(klass, klass_const).send(:include, module_const)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
::ActionController::Base.send(:include, CmpaAuth::RailsHelpers)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
module Models
|
3
|
+
module GrupoAcesso
|
4
|
+
def self.included(receiver) #:nodoc:
|
5
|
+
receiver.class_eval do
|
6
|
+
|
7
|
+
include CmpaAuth::PortalConnection
|
8
|
+
|
9
|
+
has_and_belongs_to_many :lotacoes_temporarias, :join_table => :grupoacessos_lotacoestemporarias, :foreign_key => :grupoacesso_id, :association_foreign_key => :lotacoestemporaria_id, :class_name => '::LotacaoTemporaria'
|
10
|
+
has_and_belongs_to_many :sistemas, :join_table => :grupoacessos_sistemas, :foreign_key => :grupoacesso_id, :class_name => '::Sistema'
|
11
|
+
|
12
|
+
set_table_name :grupoacessos
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
module Models
|
3
|
+
module LotacaoTemporaria
|
4
|
+
def self.included(receiver) #:nodoc:
|
5
|
+
receiver.class_eval do
|
6
|
+
|
7
|
+
include CmpaAuth::PortalConnection
|
8
|
+
|
9
|
+
belongs_to :setor, :class_name => '::Setor'
|
10
|
+
belongs_to :pessoa, :class_name => '::Pessoa'
|
11
|
+
|
12
|
+
has_and_belongs_to_many :grupos_acesso, :join_table => :grupoacessos_lotacoestemporarias, :foreign_key => :lotacoestemporaria_id, :association_foreign_key => :grupoacesso_id, :class_name => '::GrupoAcesso'
|
13
|
+
|
14
|
+
set_table_name :lotacoestemporarias
|
15
|
+
|
16
|
+
#
|
17
|
+
# Retorna todas as m�scaras da lota��o tempor�ria passada como par�metro.
|
18
|
+
#
|
19
|
+
def self.grupos_por_alias(lotacao_temporaria_id)
|
20
|
+
find(lotacao_temporaria_id).grupos_acesso.map(&:mascara)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
#
|
26
|
+
# Define os m�todos que comecem com <i>in_groups_of</i> ou
|
27
|
+
# <i>role_of</i> e que terminam com um ponto de interroga��o.
|
28
|
+
# O objetivo � ser capaz de perguntar se determinada(s) m�scara(s)
|
29
|
+
# pertence(m) �s m�scaras dos grupos de acesso de uma lota��o
|
30
|
+
# tempor�ria. Retorna <tt>true/false</tt>.
|
31
|
+
#
|
32
|
+
# Opcionalmente voc� ainda pode incluir and's ou or's entre as
|
33
|
+
# m�scaras.
|
34
|
+
#
|
35
|
+
# Note que depois que o m�todo for definido o Ruby n�o chamar� mais
|
36
|
+
# esse m�todo (<tt>method_missing</tt>), o que torna essa uma
|
37
|
+
# solu��o bastante eficiente.
|
38
|
+
#
|
39
|
+
# <i>Sup�e-se que as m�scaras est�o em mai�sculas no banco de dados.</i>
|
40
|
+
#
|
41
|
+
# Exemplo:
|
42
|
+
#
|
43
|
+
# # Encontra uma lota��o tempor�ria.
|
44
|
+
# current_lotacao = LotacaoTemporaria.find(params[:id])
|
45
|
+
#
|
46
|
+
# # Lota��o atual possui a m�scara SUPER?.
|
47
|
+
# current_lotacao.role_of_super?
|
48
|
+
#
|
49
|
+
# # Lota��o atual possui as m�scaras SUPER e EDITOR?
|
50
|
+
# current_lotacao.role_of_super_and_editor?
|
51
|
+
#
|
52
|
+
# # Lota��o atual possui qualquer uma das m�scaras EDITOR ou FOTOGRAFO?
|
53
|
+
# current_lotacao.role_of_editor_or_fotografo?
|
54
|
+
#
|
55
|
+
def method_missing(name, *args, &block)
|
56
|
+
if name.to_s =~ /^in_groups_of_(\w+)\?$/ || name.to_s =~ /^role_of_(\w+)\?$/
|
57
|
+
group_names = $1
|
58
|
+
masks = grupos_acesso.map(&:mascara)
|
59
|
+
in_masks = lambda { |group| masks.include? group.upcase }
|
60
|
+
|
61
|
+
if group_names =~ /_and_(?!\w+_or_)/ # Grupos separados por _and_ mas n�o por _or_
|
62
|
+
define_method(name) { group_names.split('_and_').all? &in_masks }
|
63
|
+
elsif group_names =~ /_or_(?!\w+_and_)/ # Grupos separados por _or_ mas n�o por _and_
|
64
|
+
define_method(name) { group_names.split('_or_').any? &in_masks }
|
65
|
+
else # Somente um grupo
|
66
|
+
define_method(name) { masks.include? group_names.upcase }
|
67
|
+
end
|
68
|
+
|
69
|
+
send name # O m�todo <name> foi definido ent�o podemos cham�-lo.
|
70
|
+
else
|
71
|
+
super name, *args, &block
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def define_method(name, &block) #:nodoc:
|
76
|
+
self.class.class_eval { define_method(name, &block) }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
module Models
|
3
|
+
module Pessoa
|
4
|
+
def self.included(receiver) #:nodoc:
|
5
|
+
receiver.class_eval do
|
6
|
+
|
7
|
+
include CmpaAuth::PortalConnection
|
8
|
+
|
9
|
+
set_table_name :pessoas
|
10
|
+
|
11
|
+
def lotacoes_temporarias_ativas
|
12
|
+
::LotacaoTemporaria.all(:conditions => {:fim => nil, :pessoa_id => id})
|
13
|
+
end
|
14
|
+
|
15
|
+
def senha=(pass)
|
16
|
+
if pass != "senhaantiga" && pass.present?
|
17
|
+
salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp
|
18
|
+
self.senha_salt = salt
|
19
|
+
self.senha_hash = Digest::SHA256.hexdigest(pass + salt)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
module Models
|
3
|
+
module Setor
|
4
|
+
def self.included(receiver) #:nodoc:
|
5
|
+
receiver.class_eval do
|
6
|
+
|
7
|
+
include CmpaAuth::PortalConnection
|
8
|
+
|
9
|
+
has_many :lotacoes_temporarias, :foreign_key => :setor_id, :class_name => '::LotacaoTemporaria'
|
10
|
+
has_many :funcionarios, :through => :lotacoes_temporarias, :source => :pessoa
|
11
|
+
|
12
|
+
set_table_name :setores
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
module Models
|
3
|
+
module Sistema
|
4
|
+
def self.included(receiver) #:nodoc:
|
5
|
+
receiver.class_eval do
|
6
|
+
|
7
|
+
include CmpaAuth::PortalConnection
|
8
|
+
|
9
|
+
default_scope :order => :nome
|
10
|
+
|
11
|
+
has_and_belongs_to_many :grupos_acesso, :join_table => :grupoacessos_sistemas, :association_foreign_key => :grupoacesso_id, :class_name => '::GrupoAcesso'
|
12
|
+
|
13
|
+
set_table_name :sistemas
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
|
3
|
+
#
|
4
|
+
# Este m�dulo � inclu�do em todos os modelos do cmpa_auth, exceto aqueles
|
5
|
+
# que herdam de uma classe que j� o contenha, como � o caso dos modelos
|
6
|
+
# +Estagiario+ e +Funcionario+.
|
7
|
+
#
|
8
|
+
module PortalConnection
|
9
|
+
def self.included(receiver) #:nodoc:
|
10
|
+
|
11
|
+
# Estabelece uma conex�o em um banco qualquer, configurado com +cmpa_auth+.
|
12
|
+
# Caso esta configura��o n�o seja v�lida ent�o � utilizado o mesmo banco
|
13
|
+
# do environment atual.
|
14
|
+
begin
|
15
|
+
receiver.establish_connection :cmpa_auth
|
16
|
+
rescue Exception
|
17
|
+
receiver.establish_connection ::Rails.env
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module CmpaAuth
|
2
|
+
|
3
|
+
#
|
4
|
+
# Implementa a autentica��o atrav�s de um before_filter.
|
5
|
+
# Todo o controle � realizado atrav�s de dois ids armazenados na
|
6
|
+
# sess�o: current_user_id e lotacao_temporaria_id.
|
7
|
+
#
|
8
|
+
# O m�dulo tamb�m oferece suporte a algumas facilidades, como perguntar
|
9
|
+
# se o usu�rio est� logado.
|
10
|
+
#
|
11
|
+
module RailsHelpers
|
12
|
+
def self.included(receiver) #:nodoc:
|
13
|
+
receiver.class_eval do
|
14
|
+
|
15
|
+
before_filter :check_authentication
|
16
|
+
helper_method :current_user, :current_lotacao, :logged_in?
|
17
|
+
|
18
|
+
rescue_from CmpaAuth::AccessDenied, :with => lambda { render_403 }
|
19
|
+
|
20
|
+
#
|
21
|
+
# Renderiza uma mensagem de erro HTML to tipo 403 (proibido) nos casos
|
22
|
+
# em que a exce��o CmpaAuth::AccessDenied for disparada.
|
23
|
+
#
|
24
|
+
def render_403
|
25
|
+
render :template => "errors/error_403", :status => 403, :layout => false
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def check_authentication
|
31
|
+
redirect_to new_session_url unless logged_in?
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Retorna o usu�rio logado na sess�o.
|
36
|
+
#
|
37
|
+
def current_user
|
38
|
+
@current_user ||= ::Pessoa.find_by_id(session[:current_user_id])
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# Retorna a lota��o tempor�ria atual (aquela que o usu�rio escolheu ao
|
43
|
+
# logar no sistema).
|
44
|
+
#
|
45
|
+
def current_lotacao
|
46
|
+
@current_lotacao ||= ::LotacaoTemporaria.find_by_id(session[:lotacao_temporaria_id])
|
47
|
+
end
|
48
|
+
|
49
|
+
# Verifica se o usu�rio est� logado.
|
50
|
+
def logged_in?
|
51
|
+
current_user && current_lotacao
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/cmpa_auth.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'digest/sha2'
|
2
|
+
|
3
|
+
require 'cmpa_auth/models/estagiario'
|
4
|
+
require 'cmpa_auth/models/funcionario'
|
5
|
+
require 'cmpa_auth/models/grupo_acesso'
|
6
|
+
require 'cmpa_auth/models/lotacao_temporaria'
|
7
|
+
require 'cmpa_auth/models/pessoa'
|
8
|
+
require 'cmpa_auth/models/setor'
|
9
|
+
require 'cmpa_auth/models/sistema'
|
10
|
+
|
11
|
+
require 'cmpa_auth/access_denied'
|
12
|
+
require 'cmpa_auth/authentication'
|
13
|
+
require 'cmpa_auth/portal_connection'
|
14
|
+
require 'cmpa_auth/rails_helpers'
|
15
|
+
|
16
|
+
require 'cmpa_auth/extensions'
|
17
|
+
|
18
|
+
# Copia as imagens dos sistemas para a pasta public/images/sistemas da aplicação.
|
19
|
+
images_src = File.join(File.dirname(__FILE__), '../public/images/sistemas/*')
|
20
|
+
images_dst = "#{Rails.public_path}/images/sistemas/"
|
21
|
+
FileUtils.mkdir_p images_dst
|
22
|
+
FileUtils.cp_r Dir.glob(images_src), images_dst
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'cmpa_auth'
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cmpa_auth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- "CMPA Assessoria de Inform\xC3\xA1tica"
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-10 00:00:00 -02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: "Biblioteca de autentica\xC3\xA7\xC3\xA3o para a Assessoria de Inform\xC3\xA1tica (CMPA)."
|
17
|
+
email: icaro.ldm@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
- CHANGELOG.rdoc
|
25
|
+
files:
|
26
|
+
- init.rb
|
27
|
+
- README.rdoc
|
28
|
+
- CHANGELOG.rdoc
|
29
|
+
- MIT-LICENSE
|
30
|
+
- rails/init.rb
|
31
|
+
- lib/cmpa_auth/access_denied.rb
|
32
|
+
- lib/cmpa_auth/authentication.rb
|
33
|
+
- lib/cmpa_auth/extensions.rb
|
34
|
+
- lib/cmpa_auth/models/estagiario.rb
|
35
|
+
- lib/cmpa_auth/models/funcionario.rb
|
36
|
+
- lib/cmpa_auth/models/grupo_acesso.rb
|
37
|
+
- lib/cmpa_auth/models/lotacao_temporaria.rb
|
38
|
+
- lib/cmpa_auth/models/pessoa.rb
|
39
|
+
- lib/cmpa_auth/models/setor.rb
|
40
|
+
- lib/cmpa_auth/models/sistema.rb
|
41
|
+
- lib/cmpa_auth/portal_connection.rb
|
42
|
+
- lib/cmpa_auth/rails_helpers.rb
|
43
|
+
- lib/cmpa_auth.rb
|
44
|
+
- app/controllers/sessions_controller.rb
|
45
|
+
- app/helpers/sessions_helper.rb
|
46
|
+
- app/views/errors/error_403.html.erb
|
47
|
+
- app/views/layouts/sessions.html.erb
|
48
|
+
- app/views/sessions/index.html.erb
|
49
|
+
- app/views/sessions/new.html.erb
|
50
|
+
- app/views/sessions/selecao_lotacao_temporaria.html.erb
|
51
|
+
- config/config.yml
|
52
|
+
- config/routes.rb
|
53
|
+
- public/images/sistemas/administrativo.png
|
54
|
+
- public/images/sistemas/agenda.png
|
55
|
+
- public/images/sistemas/aviso.png
|
56
|
+
- public/images/sistemas/central_transportes.png
|
57
|
+
- public/images/sistemas/controle_acesso.png
|
58
|
+
- public/images/sistemas/convenios.png
|
59
|
+
- public/images/sistemas/cotas.png
|
60
|
+
- public/images/sistemas/cursos_eventos.png
|
61
|
+
- public/images/sistemas/dados_pessoais.png
|
62
|
+
- public/images/sistemas/efetividade.png
|
63
|
+
- public/images/sistemas/formulario.png
|
64
|
+
- public/images/sistemas/helpdesk.png
|
65
|
+
- public/images/sistemas/movimentacao_pessoal.png
|
66
|
+
- public/images/sistemas/ouvidoria.png
|
67
|
+
- public/images/sistemas/pesquisa.png
|
68
|
+
- public/images/sistemas/pesquisa_organizacional.png
|
69
|
+
- public/images/sistemas/processo_eletronico.png
|
70
|
+
- public/images/sistemas/qbm.png
|
71
|
+
- public/images/sistemas/seguranca.png
|
72
|
+
- public/images/sistemas/sms.png
|
73
|
+
- public/images/sistemas/telefonia.jpg
|
74
|
+
- public/images/sistemas/telephone.png
|
75
|
+
- public/images/sistemas/video.png
|
76
|
+
has_rdoc: true
|
77
|
+
homepage:
|
78
|
+
licenses: []
|
79
|
+
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: "0"
|
96
|
+
version:
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 1.3.5
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: "Adiciona uma solu\xC3\xA7\xC3\xA3o completa de autentica\xC3\xA7\xC3\xA3o e permiss\xC3\xB5es."
|
104
|
+
test_files: []
|
105
|
+
|