esp-auth 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +28 -0
- data/Rakefile +28 -0
- data/app/assets/images/esp_auth/gh_icons.png +0 -0
- data/app/assets/images/esp_auth/inline_error_arrow.png +0 -0
- data/app/assets/images/esp_auth/wood.jpg +0 -0
- data/app/assets/javascripts/esp_auth/application.js +4 -0
- data/app/assets/javascripts/esp_auth/jquery.noisy.min.js +3 -0
- data/app/assets/javascripts/esp_auth/permissions.js +62 -0
- data/app/assets/stylesheets/esp_auth/application.css +11 -0
- data/app/assets/stylesheets/esp_auth/buttons.sass +300 -0
- data/app/assets/stylesheets/esp_auth/jquery_ui.sass +1493 -0
- data/app/assets/stylesheets/esp_auth/pagination.sass +19 -0
- data/app/assets/stylesheets/esp_auth/permissions.sass +150 -0
- data/app/assets/stylesheets/esp_auth/shared.sass +84 -0
- data/app/controllers/esp_auth/application_controller.rb +11 -0
- data/app/controllers/esp_auth/omniauth_callbacks_controller.rb +11 -0
- data/app/controllers/esp_auth/permissions_controller.rb +13 -0
- data/app/controllers/esp_auth/sessions_controller.rb +16 -0
- data/app/controllers/esp_auth/users_controller.rb +24 -0
- data/app/models/user_search.rb +13 -0
- data/app/views/esp_auth/permissions/new.html.erb +23 -0
- data/app/views/esp_auth/shared/_footer.html.erb +12 -0
- data/app/views/esp_auth/shared/_header.html.erb +24 -0
- data/app/views/esp_auth/users/index.html.erb +53 -0
- data/app/views/layouts/esp_auth/application.html.erb +18 -0
- data/config/initializers/devise.rb +223 -0
- data/config/locales/ru.yml +35 -0
- data/config/routes.rb +25 -0
- data/lib/esp-auth.rb +19 -0
- data/lib/esp_auth/engine.rb +41 -0
- data/lib/esp_auth/spec_helper.rb +68 -0
- data/lib/esp_auth/version.rb +3 -0
- data/lib/generators/esp_auth/install/install_generator.rb +49 -0
- data/lib/generators/esp_auth/install/templates/app/controllers/manage/application_controller.rb +3 -0
- data/lib/generators/esp_auth/install/templates/app/models/ability.rb +41 -0
- data/lib/generators/esp_auth/install/templates/app/models/context.rb +27 -0
- data/lib/generators/esp_auth/install/templates/app/models/permission.rb +69 -0
- data/lib/generators/esp_auth/install/templates/app/models/subcontext.rb +21 -0
- data/lib/generators/esp_auth/install/templates/app/models/user.rb +67 -0
- data/lib/generators/esp_auth/install/templates/config/locales/permissions_enum.ru.yml +6 -0
- data/lib/generators/esp_auth/install/templates/config/schedule.rb +5 -0
- data/lib/generators/esp_auth/install/templates/db/migrate/esp_auth_create_contexts.rb +12 -0
- data/lib/generators/esp_auth/install/templates/db/migrate/esp_auth_create_permissions.rb +11 -0
- data/lib/generators/esp_auth/install/templates/db/migrate/esp_auth_create_subcontexts.rb +9 -0
- data/lib/generators/esp_auth/install/templates/db/migrate/esp_auth_create_users.rb +29 -0
- data/lib/generators/esp_auth/install/templates/db/seeds.rb +4 -0
- data/lib/generators/esp_auth/install/templates/spec/models/ability_spec.rb +83 -0
- data/lib/omniauth/strategies/identity.rb +15 -0
- data/lib/tasks/sync.rake +17 -0
- metadata +453 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
@import "compass/utilities"
|
2
|
+
@import "compass/css3"
|
3
|
+
|
4
|
+
.pagination
|
5
|
+
span
|
6
|
+
+inline-block
|
7
|
+
border: 1px solid #ccc
|
8
|
+
+border-radius
|
9
|
+
margin: 0 2px
|
10
|
+
&.current,
|
11
|
+
&.gap,
|
12
|
+
a
|
13
|
+
+inline-block
|
14
|
+
padding: 5px 10px
|
15
|
+
&.current,
|
16
|
+
&.gap
|
17
|
+
cursor: default
|
18
|
+
&.current
|
19
|
+
background: #bbb
|
@@ -0,0 +1,150 @@
|
|
1
|
+
@import "compass/utilities"
|
2
|
+
@import "compass/reset"
|
3
|
+
@import "compass/css3"
|
4
|
+
|
5
|
+
body
|
6
|
+
background: #73351F image_url('esp_auth/wood.jpg') no-repeat center top fixed
|
7
|
+
color: #333
|
8
|
+
font-family: Helvetica, Verdana, sans-serif
|
9
|
+
font-size: 13px
|
10
|
+
line-height: 16px
|
11
|
+
|
12
|
+
a
|
13
|
+
color: #484B51
|
14
|
+
outline: none
|
15
|
+
text-decoration: none
|
16
|
+
|
17
|
+
&:active, &:hover
|
18
|
+
color: #484B51
|
19
|
+
text-decoration: underline
|
20
|
+
|
21
|
+
h1
|
22
|
+
+single-text-shadow(#555, 1px, 1px, 3px)
|
23
|
+
color: whitesmoke
|
24
|
+
font-size: 28px
|
25
|
+
text-align: center
|
26
|
+
padding: 15px 0
|
27
|
+
width: 100%
|
28
|
+
|
29
|
+
h3
|
30
|
+
font-size: 14px
|
31
|
+
|
32
|
+
span
|
33
|
+
font-weight: bold
|
34
|
+
|
35
|
+
.container
|
36
|
+
+border-radius(4px)
|
37
|
+
+single-box-shadow(#555, 0px, 0px, 20px)
|
38
|
+
background: #EEF1F8
|
39
|
+
margin: 5px auto 0
|
40
|
+
padding: 25px 30px
|
41
|
+
width: 960px
|
42
|
+
|
43
|
+
.new_permission
|
44
|
+
display: block
|
45
|
+
margin: 0 0 15px 0
|
46
|
+
text-align: right
|
47
|
+
|
48
|
+
.permission_list
|
49
|
+
display: none
|
50
|
+
|
51
|
+
.collection_list
|
52
|
+
|
53
|
+
li
|
54
|
+
+clearfix
|
55
|
+
border: 1px solid #A17345
|
56
|
+
margin: 0 0 15px 0
|
57
|
+
padding: 15px 20px
|
58
|
+
|
59
|
+
li.user
|
60
|
+
+border-radius(4px)
|
61
|
+
|
62
|
+
ul
|
63
|
+
+clearfix
|
64
|
+
width: 100%
|
65
|
+
|
66
|
+
li
|
67
|
+
border: none
|
68
|
+
margin: 5px 0
|
69
|
+
padding: 0
|
70
|
+
|
71
|
+
ul
|
72
|
+
margin: 0 0 0 15px
|
73
|
+
|
74
|
+
.name, .email, h4
|
75
|
+
float: left
|
76
|
+
font-size: 14px
|
77
|
+
line-height: 26px
|
78
|
+
margin: 0 10px 0 0
|
79
|
+
|
80
|
+
.name
|
81
|
+
font-weight: bold
|
82
|
+
|
83
|
+
.button-group
|
84
|
+
float: right
|
85
|
+
|
86
|
+
.remove
|
87
|
+
margin: 0 0 0 10px
|
88
|
+
|
89
|
+
.show_permissions
|
90
|
+
float: right
|
91
|
+
text-decoration: none
|
92
|
+
|
93
|
+
.links
|
94
|
+
+clearfix
|
95
|
+
line-height: 26px
|
96
|
+
|
97
|
+
.formtastic
|
98
|
+
.inline-errors
|
99
|
+
background: transparent image_url("esp_auth/inline_error_arrow.png") no-repeat left center
|
100
|
+
font-size: 12px
|
101
|
+
color: #933
|
102
|
+
padding: 0 0 0 18px
|
103
|
+
|
104
|
+
.inputs
|
105
|
+
li
|
106
|
+
margin: 15px 0
|
107
|
+
|
108
|
+
.label
|
109
|
+
display: block
|
110
|
+
margin: 0 0 5px 0
|
111
|
+
|
112
|
+
select
|
113
|
+
font-size: 14px
|
114
|
+
height: 26px
|
115
|
+
padding: 2px 3px
|
116
|
+
width: 954px
|
117
|
+
|
118
|
+
input
|
119
|
+
font-size: 14px
|
120
|
+
height: 20px
|
121
|
+
padding: 3px 4px
|
122
|
+
width: 868px
|
123
|
+
|
124
|
+
#permission_user_search
|
125
|
+
width: 942px
|
126
|
+
|
127
|
+
|
128
|
+
.button-group
|
129
|
+
margin: 15px 0
|
130
|
+
|
131
|
+
.user_search
|
132
|
+
+clearfix
|
133
|
+
|
134
|
+
.inputs
|
135
|
+
+clearfix
|
136
|
+
float: left
|
137
|
+
margin: 0 10px 15px 0
|
138
|
+
|
139
|
+
li
|
140
|
+
margin: 0
|
141
|
+
|
142
|
+
input
|
143
|
+
font-size: 14px
|
144
|
+
height: 20px
|
145
|
+
padding: 3px 4px
|
146
|
+
width: 868px
|
147
|
+
|
148
|
+
.buttons
|
149
|
+
+clearfix
|
150
|
+
margin: 2px 0 0 0
|
@@ -0,0 +1,84 @@
|
|
1
|
+
@import 'compass/utilities'
|
2
|
+
@import 'compass/css3'
|
3
|
+
|
4
|
+
$esp_auth_body_margin_top: 35px !default
|
5
|
+
$esp_auth_body_margin_bottom: 40px !default
|
6
|
+
|
7
|
+
$esp_auth_font_size: 11px !default
|
8
|
+
$esp_auth_font_family: Arial, Verdana, sans-serif !default
|
9
|
+
|
10
|
+
$esp_auth_text_color: #000 !default
|
11
|
+
$esp_auth_background_color: window !default
|
12
|
+
$esp_auth_link_color: #031074 !default
|
13
|
+
$esp_auth_underline_link: true !default
|
14
|
+
$esp_auth_hover_link_color: #000055 !default
|
15
|
+
$esp_auth_underline_hover_link: false !default
|
16
|
+
|
17
|
+
body
|
18
|
+
margin-top: $esp_auth_body_margin_top
|
19
|
+
margin-bottom: $esp_auth_body_margin_bottom
|
20
|
+
|
21
|
+
=fixed_block
|
22
|
+
+nested-reset
|
23
|
+
+single-box-shadow
|
24
|
+
font-size: $esp_auth_font_size
|
25
|
+
font-family: $esp_auth_font_family
|
26
|
+
background-color: $esp_auth_background_color
|
27
|
+
line-height: 1.5
|
28
|
+
color: $esp_auth_text_color
|
29
|
+
position: fixed
|
30
|
+
width: 100%
|
31
|
+
z-index: 99999
|
32
|
+
a
|
33
|
+
color: $esp_auth_link_color
|
34
|
+
@if $esp_auth_underline_link
|
35
|
+
text-decoration: underline
|
36
|
+
@else
|
37
|
+
text-decoration: none
|
38
|
+
&:hover
|
39
|
+
color: $esp_auth_hover_link_color
|
40
|
+
@if $esp_auth_underline_hover_link
|
41
|
+
text-decoration: underline
|
42
|
+
@else
|
43
|
+
text-decoration: none
|
44
|
+
&.selected
|
45
|
+
color: $esp_auth_text_color
|
46
|
+
@if $esp_auth_underline_link
|
47
|
+
text-decoration: none
|
48
|
+
@else
|
49
|
+
text-decoration: underline
|
50
|
+
|
51
|
+
.esp_auth_header_wrapper
|
52
|
+
+fixed_block
|
53
|
+
top: 0
|
54
|
+
left: 0
|
55
|
+
border-bottom: 1px solid #999
|
56
|
+
|
57
|
+
.esp_auth_header
|
58
|
+
+clearfix
|
59
|
+
margin: 5px 10px
|
60
|
+
.navigation
|
61
|
+
float: left
|
62
|
+
a
|
63
|
+
margin-right: 5px
|
64
|
+
.auth
|
65
|
+
float: right
|
66
|
+
.current_user
|
67
|
+
margin-right: 5px
|
68
|
+
|
69
|
+
|
70
|
+
.esp_auth_footer_wrapper
|
71
|
+
+fixed_block
|
72
|
+
bottom: 0
|
73
|
+
left: 0
|
74
|
+
border-top: 1px solid #999
|
75
|
+
|
76
|
+
.esp_auth_footer
|
77
|
+
+clearfix
|
78
|
+
margin: 5px 10px
|
79
|
+
.info
|
80
|
+
float: left
|
81
|
+
.developer
|
82
|
+
float: right
|
83
|
+
.range
|
84
|
+
margin-right: 5px
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class EspAuth::ApplicationController < ApplicationController
|
2
|
+
esp_load_and_authorize_resource
|
3
|
+
|
4
|
+
before_filter :authorize_user_can_manage_permissions!
|
5
|
+
|
6
|
+
protected
|
7
|
+
|
8
|
+
def authorize_user_can_manage_permissions!
|
9
|
+
authorize! :manage, :permissions
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class EspAuth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
2
|
+
def identity
|
3
|
+
user = User.find_or_initialize_by_uid(request.env['omniauth.auth']['uid']).tap do |user|
|
4
|
+
user.update_attributes request.env['omniauth.auth']['info']
|
5
|
+
end
|
6
|
+
|
7
|
+
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Identity"
|
8
|
+
sign_in user, :event => :authentication
|
9
|
+
redirect_to stored_location_for(:user) || main_app.root_path
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class EspAuth::PermissionsController < EspAuth::ApplicationController
|
2
|
+
belongs_to :user, :optional => true
|
3
|
+
actions :new, :create, :destroy
|
4
|
+
|
5
|
+
def create
|
6
|
+
create!{ esp_auth.users_path }
|
7
|
+
end
|
8
|
+
|
9
|
+
def destroy
|
10
|
+
destroy!{ esp_auth.users_path }
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class EspAuth::SessionsController < ApplicationController
|
2
|
+
def destroy
|
3
|
+
reset_session
|
4
|
+
redirect_to "#{Settings['sso.url']}/users/sign_out?redirect_uri=#{CGI.escape(redirect_uri)}"
|
5
|
+
end
|
6
|
+
|
7
|
+
protected
|
8
|
+
|
9
|
+
def redirect_uri
|
10
|
+
URI.parse(request.url).tap do | uri |
|
11
|
+
uri.path = main_app.root_path
|
12
|
+
uri.query = nil
|
13
|
+
end.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class EspAuth::UsersController < EspAuth::ApplicationController
|
2
|
+
has_searcher
|
3
|
+
|
4
|
+
actions :index, :search
|
5
|
+
|
6
|
+
has_scope :page, :default => 1
|
7
|
+
|
8
|
+
def search
|
9
|
+
render :json => JSON.parse(Curl::Easy.http_get("#{Settings['sso.url']}/users.json?user_search[keywords]=#{URI.escape(params[:term])}").body_str) and return
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
def collection
|
14
|
+
get_collection_ivar || set_collection_ivar(search_and_paginate_collection)
|
15
|
+
end
|
16
|
+
|
17
|
+
def search_and_paginate_collection
|
18
|
+
search_object = searcher_for(resource_instance_name)
|
19
|
+
search_object.permissions_count_gt = 1
|
20
|
+
search_object.pagination = {:page => params[:page], :per_page => 10}
|
21
|
+
search_object.order_by = 'uid' if search_object.term.blank?
|
22
|
+
search_object.results
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<h3>
|
2
|
+
<%= "#{t('permissions.You are adding role to')} #{@user.try(:name)}" %>
|
3
|
+
</h3>
|
4
|
+
|
5
|
+
<%= semantic_form_for resource,
|
6
|
+
:url => (@user ? esp_auth.user_permissions_path(@user) : esp_auth.permissions_path) do |form| %>
|
7
|
+
<%= form.inputs do %>
|
8
|
+
<%= form.input :user_uid, :as => :hidden %>
|
9
|
+
<%= form.input :user_name, :as => :hidden %>
|
10
|
+
<%= form.input :user_email, :as => :hidden %>
|
11
|
+
<%= form.input :user_search, :as => :string unless @user %>
|
12
|
+
<%= form.input :polimorphic_context, :as => :select,
|
13
|
+
:collection => current_user.contexts_tree,
|
14
|
+
:member_value => ->(c) { [c.class.model_name.underscore, c.id].join('_') },
|
15
|
+
:member_label => ->(c) { (' ' * 2 * c.depth + c.title).html_safe },
|
16
|
+
:include_blank => t('permissions.not_selected') %>
|
17
|
+
<%= form.input :role, :as => :select, :collection => Permission.human_enums[:role].invert, :include_blank => t('permissions.not_selected') %>
|
18
|
+
<% end %>
|
19
|
+
<%= form.buttons :class => 'button-group' do %>
|
20
|
+
<li><%= button_tag t('permissions.create'), :class => 'button icon approve' %></li>
|
21
|
+
<li><%= link_to t('permissions.cancel'), esp_auth.users_path, :class => 'button icon arrowleft' %></li>
|
22
|
+
<% end %>
|
23
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class='esp_auth_footer_wrapper'>
|
2
|
+
<div class='esp_auth_footer'>
|
3
|
+
<div class='info'>
|
4
|
+
<%= [request.remote_addr, request.remote_ip].join(', ').split(', ').uniq.join(', ') %>
|
5
|
+
<%= request.env['HTTP_USER_AGENT'] %>
|
6
|
+
</div>
|
7
|
+
<div class='developer'>
|
8
|
+
<span class='range'>2011–<%= Date.today.year %></span>
|
9
|
+
<a href='http://openteam.ru/' title='Сделано с любовью в OpenTeam'>OpenTeam</a>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<div class='esp_auth_header_wrapper'>
|
2
|
+
<div class='esp_auth_header'>
|
3
|
+
<% if current_user %>
|
4
|
+
<% current = controller_path.match(/^([a-z_]+)/)[0].inquiry %>
|
5
|
+
<div class='navigation'>
|
6
|
+
<% if can? :manage, :application %>
|
7
|
+
<%= link_to 'Публичный вид', '/', :class => current.manage? || current.esp_auth? ? nil : 'selected' %>
|
8
|
+
<%= link_to 'Система управления', '/manage', :class => current.manage? ? 'selected' : nil %>
|
9
|
+
<% end %>
|
10
|
+
<% if can? :manage, :permissions %>
|
11
|
+
<%= link_to 'Права доступа', esp_auth.root_path, :class => current.esp_auth? ? 'selected' : nil %>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
14
|
+
<div class='auth'>
|
15
|
+
<span class='current_user'><%= current_user.name %></span>
|
16
|
+
<%= link_to('Выход', esp_auth.destroy_user_session_path) %>
|
17
|
+
</div>
|
18
|
+
<% else %>
|
19
|
+
<div class='auth'>
|
20
|
+
<%= link_to 'Вход в систему', user_omniauth_authorize_path(:identity) %>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
</div>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
<%= semantic_search_form_for :user, :url => esp_auth.users_path do |form| %>
|
2
|
+
<%= form.inputs do %>
|
3
|
+
<%= form.input :term, :as => :string, :label => false %>
|
4
|
+
<% end %>
|
5
|
+
<%= form.buttons do %>
|
6
|
+
<li><%= button_tag t('permissions.search'), :class => 'button icon search' %></li>
|
7
|
+
<% end %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<%= link_to "+#{t('permissions.create_permission')}".html_safe,
|
11
|
+
esp_auth.new_permission_path,
|
12
|
+
:class => 'new_permission' %>
|
13
|
+
|
14
|
+
<ul class='collection_list'>
|
15
|
+
<% collection.each do |user| %>
|
16
|
+
<li class='user'>
|
17
|
+
<div class="name">
|
18
|
+
<%= user.name %>
|
19
|
+
</div>
|
20
|
+
<div class="email">
|
21
|
+
<<%= mail_to user.email, user.email %>>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="links">
|
25
|
+
<%= link_to "↓ #{t('permissions.show_permissions')}".html_safe, '#', :class => 'show_permissions' %>
|
26
|
+
<%= link_to "+#{t('permissions.new')}".html_safe, esp_auth.new_user_permission_path(user), :class => 'add' %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<ul class='permission_list'>
|
30
|
+
<% user.permissions.group_by(&:role).each do |role, permissions| %>
|
31
|
+
<li>
|
32
|
+
<h4><%= permissions.first.human_role %></h4>
|
33
|
+
<ul>
|
34
|
+
<% permissions.each do |permission| %>
|
35
|
+
<li>
|
36
|
+
<%= permission.context %>
|
37
|
+
<%= link_to t('permissions.delete'),
|
38
|
+
esp_auth.permission_path(permission),
|
39
|
+
:method => :delete,
|
40
|
+
:confirm => t('permissions.Are you sure?'),
|
41
|
+
:class => 'buttton icon remove danger' if can?(:destroy, permission) %>
|
42
|
+
</li>
|
43
|
+
<% end %>
|
44
|
+
</ul>
|
45
|
+
</li>
|
46
|
+
<% end %>
|
47
|
+
</ul>
|
48
|
+
|
49
|
+
</li>
|
50
|
+
<% end %>
|
51
|
+
</ul>
|
52
|
+
|
53
|
+
<%= paginate collection %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<!DOCTYPE HTML>
|
2
|
+
<html lang="ru">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<title><%= t('permissions.title') %></title>
|
6
|
+
<%= stylesheet_link_tag 'esp_auth/application' %>
|
7
|
+
<%= javascript_include_tag 'esp_auth/application' %>
|
8
|
+
<%= csrf_meta_tags %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<%= render :partial => "esp_auth/shared/header" %>
|
12
|
+
<h1><%= t('permissions.title') %></h1>
|
13
|
+
<div class="container">
|
14
|
+
<%= yield %>
|
15
|
+
</div>
|
16
|
+
<%= render :partial => "esp_auth/shared/footer" %>
|
17
|
+
</body>
|
18
|
+
</html>
|