auth_client 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89c8304e810a83061d1952e20b3f370e0a457f58
4
- data.tar.gz: 30559b55d253ba9455b03a4e9bb89a85058bbccc
3
+ metadata.gz: 0ee62d1441bd1818134640c3133387764de22742
4
+ data.tar.gz: fee00f50739000a0729390831459529cc588f652
5
5
  SHA512:
6
- metadata.gz: a7831f84f6a97e6258d0e3a80b086ce62de8453ebc2b4e4222a7ffe5217391e1140f14ec7d4a2b7e40637084f6b7b24e1e2f221852609003875da1dcc634592d
7
- data.tar.gz: 65f8dbbdf1fb1f861e23a2beec150f36ff9d57481b30907063fefe6b0475b57b06de25e72357c9d085e1068113426c9c7381bf3e095019fabdc0565ff4438c61
6
+ metadata.gz: 652ac1275888cf944657c03fa5b87ff98174e01de480a99fa9dcf4c09812a854f74254849568ea11355ecac719641b0ce72053ea1d1feaa67d36db173eeedf22
7
+ data.tar.gz: 8db6b06baf79406eb8782003318b1f2f9c4589e016d662a037395b2866474b9b1eb2dc06cf60b2ca90f9f5be3a7fd823fba6e51aa6393b8571c58f4bd58bad03
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # AuthClient
2
2
 
3
- TODO: Write a gem description
4
-
5
3
  ## Installation
6
4
 
7
5
  Add this line to your application's Gemfile:
@@ -11,19 +9,27 @@ Add this line to your application's Gemfile:
11
9
  And then execute:
12
10
 
13
11
  $ bundle
14
-
15
- Or install it yourself as:
16
-
17
- $ gem install auth_client
18
-
19
- ## Usage
20
-
21
- TODO: Write usage instructions here
22
-
23
- ## Contributing
24
-
25
- 1. Fork it ( https://github.com/[my-github-username]/auth_client/fork )
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create a new Pull Request
12
+
13
+ Run generator:
14
+
15
+ bundle exec rails generate auth_client:install
16
+
17
+ Or use similar models
18
+
19
+ ```ruby
20
+ class User
21
+ include AuthClient::User
22
+
23
+ # your code goes here
24
+ end
25
+ ```
26
+
27
+ ```ruby
28
+ class Permission < ActiveRecord::Base
29
+ include AuthClient::Permission
30
+
31
+ acts_as_auth_client_permission roles: [:admin]
32
+
33
+ # your code goes here
34
+ end
35
+ ```
@@ -21,7 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.6"
22
22
  spec.add_development_dependency "rake"
23
23
 
24
- spec.add_dependency 'auth_redis_user_connector'
25
24
  spec.add_dependency 'activesupport'
25
+ spec.add_dependency 'auth_redis_user_connector'
26
26
  spec.add_dependency 'configliere'
27
+ spec.add_dependency 'daemons'
28
+ spec.add_dependency 'rails'
27
29
  end
@@ -1,13 +1,10 @@
1
1
  require "auth_client/version"
2
2
 
3
+ require 'auth_client/helpers'
4
+ require 'auth_client/permission'
3
5
  require 'auth_client/user'
4
- require 'auth_client/auth_client_helpers'
6
+ require 'auth_client/subscriber' if defined?(Rails)
5
7
 
6
8
  module AuthClient
7
9
  end
8
10
 
9
- ActiveSupport.on_load :action_controller do
10
- include AuthClientHelpers
11
-
12
- helper_method :current_user, :user_signed_in?, :sign_in_url, :sign_out_url
13
- end
@@ -0,0 +1,61 @@
1
+ require 'active_support/concern'
2
+ require 'configliere'
3
+
4
+ module AuthClient
5
+ module Helpers
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ before_action :check_session
10
+ end
11
+
12
+ def current_user
13
+ @current_user ||= ::User.find_by(id: session_user_id)
14
+ end
15
+
16
+ def user_signed_in?
17
+ !!current_user
18
+ end
19
+
20
+ def sign_in_url
21
+ uri = URI.parse(Settings['auth_server.sign_in_url'])
22
+
23
+ uri.query = { :redirect_url => request.original_url }.to_query
24
+
25
+ uri.to_s
26
+ end
27
+
28
+ def sign_out_url
29
+ uri = URI.parse(Settings['auth_server.sign_out_url'])
30
+
31
+ uri.query = { :redirect_url => request.original_url }.to_query
32
+
33
+ uri.to_s
34
+ end
35
+
36
+ private
37
+
38
+ def session_user_id
39
+ session['warden.user.user.key'].try(:first).try(:first)
40
+ end
41
+
42
+ def check_session
43
+ if session['warden.user.user.session']
44
+ last_request_at = session['warden.user.user.session']['last_request_at']
45
+ if Time.zone.now.to_i - last_request_at > 1800
46
+ session.clear
47
+ else
48
+ session['warden.user.user.session']['last_request_at'] = Time.zone.now.to_i
49
+
50
+ current_user.activity_notify if current_user
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ ActiveSupport.on_load :action_controller do
58
+ include AuthClient::Helpers
59
+
60
+ helper_method :current_user, :user_signed_in?, :sign_in_url, :sign_out_url
61
+ end
@@ -0,0 +1,32 @@
1
+ require 'active_support/concern'
2
+
3
+ module AuthClient
4
+ module Permission
5
+ extend ActiveSupport::Concern
6
+
7
+ def user
8
+ ::User.find_by id: user_id
9
+ end
10
+
11
+ module ClassMethods
12
+ def acts_as_auth_client_permission(roles: roles)
13
+ define_singleton_method :available_roles do
14
+ roles.map(&:to_s)
15
+ end
16
+
17
+ delegate :info_notify, :to => :user, :prefix => true, :allow_nil => true
18
+
19
+ after_destroy :user_info_notify
20
+ after_save :user_info_notify
21
+
22
+ belongs_to :context, :polymorphic => true
23
+
24
+ scope :for_role, ->(role) { where(:role => role) }
25
+ scope :for_context, ->(context) { where(:context_id => context.try(:id), :context_type => context.try(:class)) }
26
+
27
+ validates_inclusion_of :role, :in => available_roles + available_roles.map(&:to_sym)
28
+ validates_presence_of :role
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ require 'auth_redis_user_connector'
2
+ require 'daemons'
3
+
4
+ module AuthClient
5
+ class Subscriber < ::Rails::Railtie
6
+ rake_tasks do
7
+ namespace :subscriber do
8
+ desc 'Start listen channel'
9
+ task :start => :environment do
10
+ Daemons.call(:app_name => 'subscriber', :multiple => false, :dir_mode => :normal, :dir => 'tmp/pids') do
11
+ logger = Logger.new("#{Rails.root}/log/subscriber.log")
12
+
13
+ begin
14
+ RedisUserConnector.sub('broadcast') do |on|
15
+ on.subscribe do
16
+ logger.info 'Subscribed to broadcast channel'
17
+ end
18
+
19
+ on.message do |_, message|
20
+ logger.info "Recieved message about user <#{message}> signed in"
21
+ ::User.find_by(:id => message).try :after_signed_in
22
+ end
23
+
24
+ on.unsubscribe do
25
+ logger.info 'Unsubscribed from broadcast channel'
26
+ end
27
+ end
28
+ rescue Exception => e
29
+ logger.fatal e
30
+ end
31
+ end
32
+ end
33
+
34
+ desc 'Stop listen channel'
35
+ task :stop => :environment do
36
+ Daemons::Monitor.find('tmp/pids', 'subscriber').try :stop
37
+ end
38
+
39
+ desc 'Restart subscriber'
40
+ task :restart => :environment do
41
+ Rake::Task['subscriber:stop'].invoke
42
+ Rake::Task['subscriber:start'].invoke
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,21 +1,98 @@
1
+ require 'active_support/concern'
1
2
  require 'auth_redis_user_connector'
2
3
 
3
- class User
4
- def self.find_by(id: nil)
5
- return nil unless id
4
+ module AuthClient
5
+ module User
6
+ extend ActiveSupport::Concern
6
7
 
7
- new RedisUserConnector.get(id).merge('id' => id)
8
- end
8
+ included do
9
+ acts_as_auth_client_user
10
+ end
9
11
 
10
- def initialize(options)
11
- options.each_pair do |key, val|
12
- self.class_eval("def #{key}; @#{key}; end")
13
- self.instance_variable_set "@#{key}", val
12
+ def to_s
13
+ [surname, name, patronymic].compact.join(' ')
14
+ end
15
+
16
+ def fullname
17
+ to_s
18
+ end
19
+
20
+ def app_name
21
+ end
22
+
23
+ def check_app_name
24
+ raise 'User#app_name should not be blank' if app_name.blank?
14
25
  end
15
- end
16
26
 
17
- def to_s
18
- [surname, name, patronymic].compact.join(' ')
27
+ def activity_notify
28
+ check_app_name
29
+
30
+ RedisUserConnector.set id, "#{app_name}_last_activity", Time.zone.now.to_i
31
+ end
32
+
33
+ def info_notify
34
+ check_app_name
35
+
36
+ RedisUserConnector.set id, "#{app_name}_info", info_hash.to_json
37
+ end
38
+
39
+ def info_hash
40
+ { :permissions => permissions_info, :url => "https://#{app_name}.tusur.ru/" }
41
+ end
42
+
43
+ def permissions_info
44
+ permissions.map { |p| { :role => p.role, :info => p.context.try(:to_s) }}
45
+ end
46
+
47
+ def after_signed_in
48
+ info_notify
49
+ end
50
+
51
+ def last_activity_at
52
+ return nil if app_name.blank?
53
+
54
+ seconds = instance_variable_get("@#{app_name}_last_activity").to_i
55
+
56
+ Time.at(seconds)
57
+ end
58
+
59
+ module ClassMethods
60
+ def acts_as_auth_client_user
61
+ define_method :permissions do
62
+ ::Permission.where :user_id => id
63
+ end
64
+
65
+ define_method(:has_permission?) do |role:, context: nil|
66
+ context ?
67
+ permissions.for_role(role).for_context(context).exists? :
68
+ permissions.for_role(role).exists?
69
+ end
70
+ end
71
+
72
+ def find_by(id:)
73
+ redis_data = RedisUserConnector.get(id)
74
+
75
+ return nil if (redis_data.nil? || redis_data.empty?)
76
+
77
+ attributes = redis_data.merge(:id => id)
78
+
79
+ build_user attributes
80
+ end
81
+
82
+ private
83
+
84
+ def build_user(attributes)
85
+ new.tap do |user|
86
+ attributes.each do |attribute, value|
87
+ name = "@#{attribute}"
88
+ user.instance_variable_set name, value
89
+
90
+ user.define_singleton_method attribute do
91
+ instance_variable_get name
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
19
97
  end
20
98
  end
21
-
@@ -1,3 +1,3 @@
1
1
  module AuthClient
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,17 @@
1
+ require 'rails/generators'
2
+
3
+ module AuthClient
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ desc 'Setup AuthClient'
8
+
9
+ def copy_user
10
+ copy_file 'user.rb', 'app/models/user.rb'
11
+ end
12
+
13
+ def copy_permission
14
+ copy_file 'permission.rb', 'app/models/permission.rb'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ class Permission < ActiveRecord::Base
2
+ include AuthClient::Permission
3
+
4
+ acts_as_auth_client_permission roles: [:admin]
5
+ end
@@ -0,0 +1,7 @@
1
+ class User
2
+ include AuthClient::User
3
+
4
+ def app_name
5
+ Settings['app.host']
6
+ end
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auth_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTeam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-22 00:00:00.000000000 Z
11
+ date: 2014-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: auth_redis_user_connector
42
+ name: activesupport
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: activesupport
56
+ name: auth_redis_user_connector
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: daemons
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: Auth Client
84
112
  email:
85
113
  - developers@openteam.ru
@@ -94,9 +122,14 @@ files:
94
122
  - Rakefile
95
123
  - auth_client.gemspec
96
124
  - lib/auth_client.rb
97
- - lib/auth_client/auth_client_helpers.rb
125
+ - lib/auth_client/helpers.rb
126
+ - lib/auth_client/permission.rb
127
+ - lib/auth_client/subscriber.rb
98
128
  - lib/auth_client/user.rb
99
129
  - lib/auth_client/version.rb
130
+ - lib/generators/auth_client/install_generator.rb
131
+ - lib/generators/auth_client/templates/permission.rb
132
+ - lib/generators/auth_client/templates/user.rb
100
133
  homepage: https://github.com/openteam-com
101
134
  licenses:
102
135
  - MIT
@@ -1,51 +0,0 @@
1
- require 'active_support/concern'
2
- require 'configliere'
3
-
4
- module AuthClientHelpers
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- before_action :check_session
9
- end
10
-
11
- def current_user
12
- @current_user ||= User.find_by(:id => session_user_id)
13
- end
14
-
15
- def user_signed_in?
16
- !!current_user
17
- end
18
-
19
- def sign_in_url
20
- uri = URI.parse(Settings['auth_server.sign_in_url'])
21
-
22
- uri.query = { :redirect_url => request.original_url }.to_query
23
-
24
- uri.to_s
25
- end
26
-
27
- def sign_out_url
28
- uri = URI.parse(Settings['auth_server.sign_out_url'])
29
-
30
- uri.query = { :redirect_url => request.original_url }.to_query
31
-
32
- uri.to_s
33
- end
34
-
35
- private
36
-
37
- def session_user_id
38
- session['warden.user.user.key'].try(:first).try(:first)
39
- end
40
-
41
- def check_session
42
- if session['warden.user.user.session']
43
- last_request_at = session['warden.user.user.session']['last_request_at']
44
- if Time.zone.now.to_i - last_request_at > 1800
45
- session.clear
46
- else
47
- session['warden.user.user.session']['last_request_at'] = Time.zone.now.to_i
48
- end
49
- end
50
- end
51
- end