cmpa_auth 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/CHANGELOG.rdoc +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +131 -0
  4. data/app/controllers/sessions_controller.rb +48 -0
  5. data/app/helpers/sessions_helper.rb +16 -0
  6. data/app/views/errors/error_403.html.erb +1 -0
  7. data/app/views/layouts/sessions.html.erb +48 -0
  8. data/app/views/sessions/index.html.erb +5 -0
  9. data/app/views/sessions/new.html.erb +18 -0
  10. data/app/views/sessions/selecao_lotacao_temporaria.html.erb +6 -0
  11. data/config/config.yml +7 -0
  12. data/config/routes.rb +5 -0
  13. data/init.rb +1 -0
  14. data/lib/cmpa_auth/access_denied.rb +7 -0
  15. data/lib/cmpa_auth/authentication.rb +25 -0
  16. data/lib/cmpa_auth/extensions.rb +36 -0
  17. data/lib/cmpa_auth/models/estagiario.rb +6 -0
  18. data/lib/cmpa_auth/models/funcionario.rb +6 -0
  19. data/lib/cmpa_auth/models/grupo_acesso.rb +17 -0
  20. data/lib/cmpa_auth/models/lotacao_temporaria.rb +82 -0
  21. data/lib/cmpa_auth/models/pessoa.rb +26 -0
  22. data/lib/cmpa_auth/models/setor.rb +17 -0
  23. data/lib/cmpa_auth/models/sistema.rb +18 -0
  24. data/lib/cmpa_auth/portal_connection.rb +21 -0
  25. data/lib/cmpa_auth/rails_helpers.rb +56 -0
  26. data/lib/cmpa_auth.rb +22 -0
  27. data/public/images/sistemas/administrativo.png +0 -0
  28. data/public/images/sistemas/agenda.png +0 -0
  29. data/public/images/sistemas/aviso.png +0 -0
  30. data/public/images/sistemas/central_transportes.png +0 -0
  31. data/public/images/sistemas/controle_acesso.png +0 -0
  32. data/public/images/sistemas/convenios.png +0 -0
  33. data/public/images/sistemas/cotas.png +0 -0
  34. data/public/images/sistemas/cursos_eventos.png +0 -0
  35. data/public/images/sistemas/dados_pessoais.png +0 -0
  36. data/public/images/sistemas/efetividade.png +0 -0
  37. data/public/images/sistemas/formulario.png +0 -0
  38. data/public/images/sistemas/helpdesk.png +0 -0
  39. data/public/images/sistemas/movimentacao_pessoal.png +0 -0
  40. data/public/images/sistemas/ouvidoria.png +0 -0
  41. data/public/images/sistemas/pesquisa.png +0 -0
  42. data/public/images/sistemas/pesquisa_organizacional.png +0 -0
  43. data/public/images/sistemas/processo_eletronico.png +0 -0
  44. data/public/images/sistemas/qbm.png +0 -0
  45. data/public/images/sistemas/seguranca.png +0 -0
  46. data/public/images/sistemas/sms.png +0 -0
  47. data/public/images/sistemas/telefonia.jpg +0 -0
  48. data/public/images/sistemas/telephone.png +0 -0
  49. data/public/images/sistemas/video.png +0 -0
  50. data/rails/init.rb +1 -0
  51. 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
+ &copy; Assessoria de Informática CMPA |
44
+ <%= link_to "sair", session_url, :method => :delete %>
45
+ </div>
46
+ <% end %>
47
+ </body>
48
+ </html>
@@ -0,0 +1,5 @@
1
+ <ul class='sistemas'>
2
+ <% @sistemas.reject{ |s| s.porta.nil? }.each do |sistema| %>
3
+ <li><%= link_sistema sistema.id %></li>
4
+ <% end %>
5
+ </ul>
@@ -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
@@ -0,0 +1,5 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+ map.resource :session, :path_names => { :new => 'entrar' }
4
+ map.selecao_lotacao_temporaria '/session/selecao_lotacao_temporaria/:pessoa_id', :controller => 'sessions', :action => 'selecao_lotacao_temporaria'
5
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'cmpa_auth'
@@ -0,0 +1,7 @@
1
+ module CmpaAuth
2
+
3
+ #
4
+ # Implementa uma classe de erro para exce��es de acesso proibido (erro HTML 403).
5
+ #
6
+ class AccessDenied < StandardError; end
7
+ end
@@ -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,6 @@
1
+ module CmpaAuth
2
+ module Models
3
+ module Estagiario
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module CmpaAuth
2
+ module Models
3
+ module Funcionario
4
+ end
5
+ end
6
+ end
@@ -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
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
+