omniauth-tanmer 1.0.5 → 1.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 25bcdb0d2238841df77d666cf9a016a3d7e20b16
4
- data.tar.gz: e64171ac52debf7321ddef66d96fdd3b4760a017
3
+ metadata.gz: e53731b2c179028d8129aa617e8a605f503eebfd
4
+ data.tar.gz: 8518e217257f134d55c75a5e7d742b71ff46937f
5
5
  SHA512:
6
- metadata.gz: dfe9d29009f37eb5dba68ad0e564f4c4f2e18fa6205411b2e5c9278c24d6ffb411e850836147b860a12d4fd19d0098a86c0b0dd359d383fbe98372f3c7feb154
7
- data.tar.gz: 0dc84dafffb075919b4a92b616def4a77cb9e5d30075d0ba84374ac44b8df23a9eb206a85c825cdbe62b4457d0f213db30bcd4b9bfb802fab968dd27ccd948cc
6
+ metadata.gz: b02809a68b4bf6015f92ef948ae2eb7e4e5fd47d9d6a77a0dc2070e19562fc5d25e1f5edd3046770634012451469d1a7c8d8505258606efc18f450354b981248
7
+ data.tar.gz: a7da19d88724751dc5cd578945e1b291f8b3f7f6a380b1943f0126557ab42f259b982b035eeea2f4ed91a5d3f02711559eebaf55a2f804049a51013386f9cf60
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  This is the OAuth2 strategy for authenticating to your Tanmer service.
4
4
 
5
5
  ## Requirements
6
-
6
+
7
7
  ## Installation
8
8
 
9
9
  Add this line to your application's Gemfile:
@@ -20,10 +20,32 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- use OmniAuth::Builder do
24
- provider :tanmer, ENV['TANMER_KEY'], ENV['TANMER_SECRET'], scope: 'tanmer_service'
23
+ Put below code to `config/application.rb`:
24
+
25
+ config.middleware.use OmniAuth::Builder do
26
+ provider :tanmer, ENV['OAUTH_TANMER_KEY'], ENV['OAUTH_TANMER_SECRET'],
27
+ scope: 'public',
28
+ client_options: { site: ENV['OAUTH_TANMER_SITE'] }
25
29
  end
26
30
 
31
+ ## Features
32
+
33
+ Sync permissions:
34
+
35
+ ```ruby
36
+ current_permissions = [
37
+ { name: '查看', group_name: '会员', subject_class: 'Member', subject_id: nil, action: 'show', description: '' },
38
+ { name: '创建', group_name: '会员', subject_class: 'Member', subject_id: nil, action: 'create', description: '' },
39
+ { name: '修改', group_name: '会员', subject_class: 'Member', subject_id: nil, action: 'update', description: '' },
40
+ { name: '删除', group_name: '会员', subject_class: 'Member', subject_id: nil, action: 'destroy', description: '' },
41
+ ]
42
+
43
+ client = Omniauth::Tanmer::Permission.new(ENV['OAUTH_TANMER_HOST'], ENV['OAUTH_TANMER_KEY'], ENV['OAUTH_TANMER_SECRET'])
44
+ client.sync(current_permissions)
45
+ ```
46
+
47
+ This will sync permission definitions between local project and SSO.
48
+
27
49
  ## Contributing
28
50
 
29
51
  1. Fork it
@@ -0,0 +1,85 @@
1
+ require "faraday"
2
+ require "jwt"
3
+ module Omniauth
4
+ module Tanmer
5
+ class Permission
6
+ attr_reader :app_id, :app_secret, :conn
7
+
8
+ def initialize(oauth_host, app_id, app_secret)
9
+ @app_id = app_id
10
+ @app_secret = app_secret
11
+ @conn = Faraday.new(oauth_host)
12
+ end
13
+
14
+ def remote
15
+ resp = conn.get('/api/v1/permissions.json', app_id: app_id, sn: generate_sn(SecureRandom.uuid))
16
+ JSON.parse(resp.body).map(&:symbolize_keys)
17
+ end
18
+
19
+ def sync(permissions)
20
+ remote_permissions = remote
21
+ puts "have #{permissions.size} permissions defined"
22
+ puts "got #{remote_permissions.size} permissions from API"
23
+
24
+ permissions_to_create = []
25
+ permissions_to_destroy = []
26
+ permissions_to_update = []
27
+
28
+ compare_names = %i(name group_name subject_class subject_id action description)
29
+ finder = %i(subject_class subject_id action)
30
+
31
+ # create new
32
+ permissions.each do |current_perm|
33
+ unless remote_permissions.any? { |existing_perm| finder.all?{ |k| existing_perm[k] == current_perm[k] } }
34
+ # permissions.delete(current_perm)
35
+ permissions_to_create << current_perm
36
+ end
37
+ end
38
+ puts "#{permissions_to_create.size} permissions will be created"
39
+ permissions = permissions - permissions_to_create
40
+
41
+ # destroy old
42
+ remote_permissions.each do |existing_perm|
43
+ unless permissions.any? { |current_perm| finder.all?{ |k| existing_perm[k] == current_perm[k] } }
44
+ permissions_to_destroy << existing_perm
45
+ end
46
+ end
47
+ puts "#{permissions_to_destroy.size} permissions will be deleted from API"
48
+ remote_permissions = remote_permissions - permissions_to_destroy
49
+
50
+ remote_permissions.each do |existing_perm|
51
+ current_perm = permissions.find { |current_perm| finder.all?{ |k| existing_perm[k] == current_perm[k]} }
52
+ unless compare_names.all? { |k| existing_perm[k] == current_perm[k] }
53
+ permissions_to_update << [existing_perm[:id], current_perm]
54
+ end
55
+ end
56
+
57
+ puts "#{permissions_to_update.size} permissions will be updated"
58
+
59
+ permissions_to_destroy.each do |perm|
60
+ resp = conn.delete("/api/v1/permissions/#{perm[:id]}", app_id: app_id, sn: generate_sn(SecureRandom.uuid))
61
+ end
62
+
63
+ permissions_to_update.each do |id, perm|
64
+ resp = conn.put("/api/v1/permissions/#{id}", permission: perm, app_id: app_id, sn: generate_sn(SecureRandom.uuid))
65
+ end
66
+
67
+ permissions_to_create.each do |perm|
68
+ resp = conn.post("/api/v1/permissions", permission: perm, app_id: app_id, sn: generate_sn(SecureRandom.uuid))
69
+ data = JSON.parse(resp.body)
70
+ end
71
+ {
72
+ created: permissions_to_create,
73
+ destroyed: permissions_to_destroy,
74
+ updated: permissions_to_update
75
+ }
76
+ end
77
+
78
+ private
79
+
80
+ def generate_sn(data=nil)
81
+ JWT.encode({ data: data, exp: Time.now.to_i + 300 }, app_secret, 'HS256')
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,5 +1,5 @@
1
1
  module Omniauth
2
2
  module Tanmer
3
- VERSION = '1.0.5'
3
+ VERSION = '1.1.1'
4
4
  end
5
5
  end
@@ -1,2 +1,3 @@
1
1
  require "omniauth-tanmer/version"
2
+ require "omniauth-tanmer/permission"
2
3
  require 'omniauth/strategies/tanmer'
@@ -19,4 +19,6 @@ Gem::Specification.new do |gem|
19
19
 
20
20
  gem.add_dependency 'omniauth', '~> 1.0'
21
21
  gem.add_dependency 'omniauth-oauth2', '~> 1.0'
22
+ gem.add_dependency 'jwt'
23
+ gem.add_dependency 'faraday'
22
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-tanmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - xiaohui
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-27 00:00:00.000000000 Z
11
+ date: 2018-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: omniauth
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jwt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: This is the strategy for authenticating to your Tanmer service
42
70
  email:
43
71
  - xiaohui@tanmer.com
@@ -52,6 +80,7 @@ files:
52
80
  - README.md
53
81
  - Rakefile
54
82
  - lib/omniauth-tanmer.rb
83
+ - lib/omniauth-tanmer/permission.rb
55
84
  - lib/omniauth-tanmer/version.rb
56
85
  - lib/omniauth/strategies/tanmer.rb
57
86
  - omniauth-tanmer.gemspec
@@ -76,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
105
  version: '0'
77
106
  requirements: []
78
107
  rubyforge_project:
79
- rubygems_version: 2.5.2
108
+ rubygems_version: 2.6.14
80
109
  signing_key:
81
110
  specification_version: 4
82
111
  summary: This is the strategy for authenticating to your Tanmer service