sparkly-auth 1.0.2 → 1.1.0

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.
Files changed (243) hide show
  1. data/.document +5 -0
  2. data/.gitignore +25 -0
  3. data/HISTORY.txt +7 -0
  4. data/README.rdoc +127 -1
  5. data/Rakefile +45 -13
  6. data/TODO +4 -0
  7. data/VERSION +1 -1
  8. data/app/controllers/sparkly_accounts_controller.rb +20 -13
  9. data/app/controllers/sparkly_controller.rb +5 -4
  10. data/app/controllers/sparkly_sessions_controller.rb +16 -9
  11. data/app/helpers/sparkly_accounts_helper.rb +2 -0
  12. data/app/helpers/sparkly_helper.rb +2 -0
  13. data/app/helpers/sparkly_sessions_helper.rb +2 -0
  14. data/app/models/remembrance_token.rb +3 -1
  15. data/app/views/sparkly_accounts/_rails2_form.html.erb +24 -0
  16. data/app/views/sparkly_accounts/_rails3_form.html.erb +26 -0
  17. data/app/views/sparkly_accounts/edit.html.erb +5 -23
  18. data/app/views/sparkly_accounts/new.html.erb +4 -23
  19. data/app/views/sparkly_sessions/_rails2_form.html.erb +22 -0
  20. data/app/views/sparkly_sessions/_rails3_form.html.erb +22 -0
  21. data/app/views/sparkly_sessions/new.html.erb +4 -21
  22. data/features/create_sparkly_account.feature +12 -0
  23. data/features/delete_sparkly_account.feature +12 -0
  24. data/features/edit_sparkly_account.feature +54 -0
  25. data/features/lock_abused_sparkly_account.feature +7 -0
  26. data/features/login_sparkly_session.feature +43 -0
  27. data/features/logout_sparkly_session.feature +16 -0
  28. data/features/setup/sparkly.rb +4 -0
  29. data/features/show_sparkly_account.feature +13 -0
  30. data/features/sparkly_session_timeout.feature +6 -0
  31. data/features/step_definitions/account/account_steps.rb +16 -0
  32. data/features/step_definitions/account/brief_steps.rb +9 -0
  33. data/features/step_definitions/debug_steps.rb +3 -0
  34. data/features/step_definitions/email_steps.rb +182 -0
  35. data/features/step_definitions/session/brief_steps.rb +0 -0
  36. data/features/step_definitions/session/logged_in_steps.rb +42 -0
  37. data/features/step_definitions/session/login_steps.rb +37 -0
  38. data/features/step_definitions/session/logout_steps.rb +5 -0
  39. data/features/step_definitions/session_steps.rb +16 -0
  40. data/features/step_definitions/sparkly_auth_steps.rb +0 -0
  41. data/features/step_definitions/web_steps.rb +287 -0
  42. data/features/support/env.rb +10 -0
  43. data/features/support/paths.rb +35 -0
  44. data/features/support/sparkly_helpers.rb +42 -0
  45. data/generators/sparkly/rails2.rb +79 -0
  46. data/generators/sparkly/rails3.rb +89 -0
  47. data/generators/sparkly/sparkly_generator.rb +4 -75
  48. data/generators/sparkly/templates/accounts_controller.rb +14 -13
  49. data/generators/sparkly/templates/accounts_helper.rb +1 -1
  50. data/generators/sparkly/templates/sessions_controller.rb +26 -12
  51. data/generators/sparkly/templates/sessions_helper.rb +1 -1
  52. data/generators/sparkly/templates/views/sparkly_accounts/_rails2_form.html.erb +24 -0
  53. data/generators/sparkly/templates/views/sparkly_accounts/_rails3_form.html.erb +26 -0
  54. data/generators/sparkly/templates/views/sparkly_accounts/edit.html.erb +5 -23
  55. data/generators/sparkly/templates/views/sparkly_accounts/new.html.erb +4 -23
  56. data/generators/sparkly/templates/views/sparkly_sessions/_rails2_form.html.erb +22 -0
  57. data/generators/sparkly/templates/views/sparkly_sessions/_rails3_form.html.erb +22 -0
  58. data/generators/sparkly/templates/views/sparkly_sessions/new.html.erb +4 -21
  59. data/lib/auth.rb +22 -1
  60. data/lib/auth/behavior/base.rb +25 -18
  61. data/lib/auth/behavior/base/configuration.rb +37 -0
  62. data/lib/auth/behavior/core.rb +22 -14
  63. data/lib/auth/behavior/core/authenticated_model_methods.rb +9 -1
  64. data/lib/auth/behavior/core/controller_extensions.rb +2 -2
  65. data/lib/auth/behavior/core/controller_extensions/class_methods.rb +1 -1
  66. data/lib/auth/behavior/core/password_methods.rb +5 -5
  67. data/lib/auth/behavior/remember_me.rb +7 -3
  68. data/lib/auth/behavior/remember_me/configuration.rb +8 -11
  69. data/lib/auth/behavior/remember_me/controller_extensions.rb +1 -1
  70. data/lib/auth/behavior_lookup.rb +4 -4
  71. data/lib/auth/builtin_behaviors.rb +3 -0
  72. data/lib/auth/configuration.rb +71 -25
  73. data/lib/auth/configuration/keys.rb +50 -0
  74. data/lib/auth/engine.rb +33 -0
  75. data/lib/auth/generators/views_generator.rb +13 -4
  76. data/lib/auth/model.rb +52 -22
  77. data/{init.rb → rails/hacks/rails2.rb} +1 -14
  78. data/rails/hacks/rails3.rb +22 -0
  79. data/rails/init.rb +7 -17
  80. data/rails/init_rails2.rb +39 -0
  81. data/rails/init_rails3.rb +2 -0
  82. data/rails/routes_rails3.rb +37 -0
  83. data/rake3 +1 -0
  84. data/rerun.txt +1 -0
  85. data/run_all_tests +1 -0
  86. data/sparkly-auth.gemspec +481 -23
  87. data/spec/behaviors/core/controller_extensions_spec.rb +49 -0
  88. data/spec/{lib/auth/behavior → behaviors}/core_spec.rb +29 -12
  89. data/spec/behaviors/remember_me/configuration_spec.rb +16 -0
  90. data/spec/behaviors/remember_me_spec.rb +167 -0
  91. data/spec/generators/sanity_checks_spec.rb +58 -0
  92. data/spec/lib/auth/configuration_spec.rb +61 -0
  93. data/spec/lib/auth/model_spec.rb +6 -9
  94. data/spec/lib/auth_spec.rb +2 -2
  95. data/spec/lib/hacks/rename_attributes_spec.rb +49 -0
  96. data/spec/routes_spec.rb +8 -2
  97. data/spec/spec2_helper.rb +52 -0
  98. data/spec/spec3_helper.rb +72 -0
  99. data/spec/spec_helper.rb +109 -49
  100. data/spec_env/rails2/README.1ST +23 -0
  101. data/spec_env/rails2/Rakefile +10 -0
  102. data/spec_env/rails2/app/controllers/application_controller.rb +13 -0
  103. data/spec_env/rails2/app/helpers/application_helper.rb +3 -0
  104. data/spec_env/rails2/app/models/user.rb +2 -0
  105. data/spec_env/rails2/app/views/application/not_found.html.erb +9 -0
  106. data/spec_env/rails2/app/views/layouts/application.html.erb +9 -0
  107. data/spec_env/rails2/config/boot.rb +110 -0
  108. data/spec_env/rails2/config/cucumber.yml +7 -0
  109. data/spec_env/rails2/config/database.yml +25 -0
  110. data/spec_env/rails2/config/environment.rb +46 -0
  111. data/spec_env/rails2/config/environments/cucumber.rb +35 -0
  112. data/spec_env/rails2/config/environments/development.rb +17 -0
  113. data/spec_env/rails2/config/environments/production.rb +28 -0
  114. data/spec_env/rails2/config/environments/test.rb +31 -0
  115. data/spec_env/rails2/config/initializers/backtrace_silencers.rb +7 -0
  116. data/spec_env/rails2/config/initializers/inflections.rb +10 -0
  117. data/spec_env/rails2/config/initializers/mime_types.rb +5 -0
  118. data/spec_env/rails2/config/initializers/new_rails_defaults.rb +21 -0
  119. data/spec_env/rails2/config/initializers/session_store.rb +15 -0
  120. data/spec_env/rails2/config/initializers/sparkly_authentication.rb +30 -0
  121. data/spec_env/rails2/config/locales/en.yml +5 -0
  122. data/spec_env/rails2/config/routes.rb +46 -0
  123. data/spec_env/rails2/db/development.sqlite3 +0 -0
  124. data/spec_env/rails2/db/migrate/001_create_sparkly_passwords.rb +19 -0
  125. data/spec_env/rails2/db/migrate/002_create_sparkly_remembered_tokens.rb +15 -0
  126. data/spec_env/rails2/db/migrate/003_add_confirmed_to_sparkly_passwords.rb +9 -0
  127. data/spec_env/rails2/db/migrate/20100607103543_create_users.rb +12 -0
  128. data/spec_env/rails2/db/migrate/20100609152058_add_email_to_users.rb +9 -0
  129. data/spec_env/rails2/db/schema.rb +42 -0
  130. data/spec_env/rails2/db/seeds.rb +7 -0
  131. data/spec_env/rails2/db/test.sqlite3 +0 -0
  132. data/spec_env/rails2/doc/README_FOR_APP +2 -0
  133. data/spec_env/rails2/doc/sparkly_authentication.txt +56 -0
  134. data/spec_env/rails2/features/support/env.rb +58 -0
  135. data/spec_env/rails2/lib/tasks/cucumber.rake +47 -0
  136. data/spec_env/rails2/lib/tasks/rspec.rake +144 -0
  137. data/spec_env/rails2/lib/tasks/sparkly_migration.rb +1 -0
  138. data/spec_env/rails2/log/cucumber.log +8412 -0
  139. data/spec_env/rails2/log/development.log +317 -0
  140. data/spec_env/rails2/log/test.log +32053 -0
  141. data/spec_env/rails2/public/404.html +30 -0
  142. data/spec_env/rails2/public/422.html +30 -0
  143. data/spec_env/rails2/public/500.html +30 -0
  144. data/spec_env/rails2/public/favicon.ico +0 -0
  145. data/spec_env/rails2/public/images/rails.png +0 -0
  146. data/spec_env/rails2/public/javascripts/application.js +2 -0
  147. data/spec_env/rails2/public/javascripts/controls.js +963 -0
  148. data/spec_env/rails2/public/javascripts/dragdrop.js +973 -0
  149. data/spec_env/rails2/public/javascripts/effects.js +1128 -0
  150. data/spec_env/rails2/public/javascripts/prototype.js +4320 -0
  151. data/spec_env/rails2/public/robots.txt +5 -0
  152. data/spec_env/rails2/rerun.txt +1 -0
  153. data/spec_env/rails2/script/about +4 -0
  154. data/spec_env/rails2/script/autospec +6 -0
  155. data/spec_env/rails2/script/console +3 -0
  156. data/spec_env/rails2/script/cucumber +10 -0
  157. data/spec_env/rails2/script/dbconsole +3 -0
  158. data/spec_env/rails2/script/destroy +3 -0
  159. data/spec_env/rails2/script/generate +3 -0
  160. data/spec_env/rails2/script/performance/benchmarker +3 -0
  161. data/spec_env/rails2/script/performance/profiler +3 -0
  162. data/spec_env/rails2/script/plugin +3 -0
  163. data/spec_env/rails2/script/runner +3 -0
  164. data/spec_env/rails2/script/server +3 -0
  165. data/spec_env/rails2/script/spec +10 -0
  166. data/spec_env/rails2/spec/controllers/sparkly_user_sessions_controller_spec.rb +10 -0
  167. data/spec_env/rails2/spec/rcov.opts +2 -0
  168. data/spec_env/rails2/spec/spec.opts +4 -0
  169. data/spec_env/rails2/spec/spec_helper.rb +54 -0
  170. data/spec_env/rails2/test/fixtures/users.yml +7 -0
  171. data/spec_env/rails2/test/performance/browsing_test.rb +9 -0
  172. data/spec_env/rails2/test/test_helper.rb +38 -0
  173. data/spec_env/rails2/test/unit/user_test.rb +8 -0
  174. data/spec_env/rails2/vendor/gems/sparkly-auth-bootstrap-1.0.0/.specification +63 -0
  175. data/spec_env/rails2/vendor/gems/sparkly-auth-bootstrap-1.0.0/generators/sparkly/sparkly_generator.rb +1 -0
  176. data/spec_env/rails2/vendor/gems/sparkly-auth-bootstrap-1.0.0/lib/sparkly-auth-bootstrap.rb +6 -0
  177. data/spec_env/rails2/vendor/gems/sparkly-auth-bootstrap-1.0.0/rails/init.rb +1 -0
  178. data/spec_env/rails2/vendor/gems/sparkly-auth-bootstrap-1.0.0/sparkly-auth-bootstrap.gemspec +55 -0
  179. data/spec_env/rails3/.gitignore +4 -0
  180. data/spec_env/rails3/Gemfile +43 -0
  181. data/spec_env/rails3/Gemfile.lock +124 -0
  182. data/spec_env/rails3/README +256 -0
  183. data/spec_env/rails3/Rakefile +7 -0
  184. data/spec_env/rails3/app/controllers/application_controller.rb +6 -0
  185. data/spec_env/rails3/app/helpers/application_helper.rb +2 -0
  186. data/spec_env/rails3/app/models/user.rb +3 -0
  187. data/spec_env/rails3/app/views/application/not_found.html.erb +9 -0
  188. data/spec_env/rails3/app/views/layouts/application.html.erb +22 -0
  189. data/spec_env/rails3/config.ru +4 -0
  190. data/spec_env/rails3/config/application.rb +47 -0
  191. data/spec_env/rails3/config/boot.rb +13 -0
  192. data/spec_env/rails3/config/cucumber.yml +8 -0
  193. data/spec_env/rails3/config/database.yml +28 -0
  194. data/spec_env/rails3/config/environment.rb +5 -0
  195. data/spec_env/rails3/config/environments/development.rb +22 -0
  196. data/spec_env/rails3/config/environments/production.rb +49 -0
  197. data/spec_env/rails3/config/environments/spec.rb +35 -0
  198. data/spec_env/rails3/config/environments/test.rb +43 -0
  199. data/spec_env/rails3/config/initializers/backtrace_silencers.rb +7 -0
  200. data/spec_env/rails3/config/initializers/inflections.rb +10 -0
  201. data/spec_env/rails3/config/initializers/mime_types.rb +5 -0
  202. data/spec_env/rails3/config/initializers/secret_token.rb +7 -0
  203. data/spec_env/rails3/config/initializers/session_store.rb +8 -0
  204. data/spec_env/rails3/config/initializers/sparkly_authentication.rb +30 -0
  205. data/spec_env/rails3/config/locales/en.yml +5 -0
  206. data/spec_env/rails3/config/routes.rb +61 -0
  207. data/spec_env/rails3/db/migrate/001_create_sparkly_passwords.rb +19 -0
  208. data/spec_env/rails3/db/migrate/002_create_sparkly_remembered_tokens.rb +15 -0
  209. data/spec_env/rails3/db/migrate/20100810132843_create_users.rb +13 -0
  210. data/spec_env/rails3/db/schema.rb +42 -0
  211. data/spec_env/rails3/db/seeds.rb +7 -0
  212. data/spec_env/rails3/doc/README_FOR_APP +2 -0
  213. data/spec_env/rails3/doc/sparkly_authentication.txt +56 -0
  214. data/spec_env/rails3/features/support/env.rb +62 -0
  215. data/spec_env/rails3/lib/sparkly/bootstrap.rb +1 -0
  216. data/spec_env/rails3/lib/tasks/.gitkeep +0 -0
  217. data/spec_env/rails3/lib/tasks/cucumber.rake +53 -0
  218. data/spec_env/rails3/lib/tasks/sparkly_migration.rb +1 -0
  219. data/spec_env/rails3/public/404.html +26 -0
  220. data/spec_env/rails3/public/422.html +26 -0
  221. data/spec_env/rails3/public/500.html +26 -0
  222. data/spec_env/rails3/public/favicon.ico +0 -0
  223. data/spec_env/rails3/public/images/rails.png +0 -0
  224. data/spec_env/rails3/public/javascripts/application.js +2 -0
  225. data/spec_env/rails3/public/javascripts/controls.js +965 -0
  226. data/spec_env/rails3/public/javascripts/dragdrop.js +974 -0
  227. data/spec_env/rails3/public/javascripts/effects.js +1123 -0
  228. data/spec_env/rails3/public/javascripts/prototype.js +6001 -0
  229. data/spec_env/rails3/public/javascripts/rails.js +175 -0
  230. data/spec_env/rails3/public/robots.txt +5 -0
  231. data/spec_env/rails3/public/stylesheets/.gitkeep +0 -0
  232. data/spec_env/rails3/script/cucumber +10 -0
  233. data/spec_env/rails3/script/rails +6 -0
  234. data/spec_env/rails3/test/fixtures/users.yml +7 -0
  235. data/spec_env/rails3/test/performance/browsing_test.rb +9 -0
  236. data/spec_env/rails3/test/test_helper.rb +13 -0
  237. data/spec_env/rails3/test/unit/user_test.rb +8 -0
  238. data/spec_env/rails3/vendor/plugins/.gitkeep +0 -0
  239. data/spec_env/rails3/webrat.log +5 -0
  240. metadata +393 -15
  241. data/dependencies.rb +0 -1
  242. data/spec/lib/auth/behavior/remember_me_spec.rb +0 -127
  243. data/spec/lib/auth/extensions/controller_spec.rb +0 -32
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,25 @@
1
+ .idea
2
+ log/*.log
3
+
4
+
5
+ ## MAC OS
6
+ .DS_Store
7
+
8
+ ## TEXTMATE
9
+ *.tmproj
10
+ tmtags
11
+
12
+ ## EMACS
13
+ *~
14
+ \#*
15
+ .\#*
16
+
17
+ ## VIM
18
+ *.swp
19
+
20
+ ## PROJECT::GENERAL
21
+ coverage
22
+ rdoc
23
+ pkg
24
+
25
+ ## PROJECT::SPECIFIC
data/HISTORY.txt CHANGED
@@ -1,3 +1,10 @@
1
+ * 1.1.0 - 08-13-2010
2
+ * Official support for Rails 3 (tested against rails-3.0.0.rc)
3
+ * Better internal design
4
+ * Minor bugfixes
5
+ * Better support for per-model configuration
6
+ * Improved API for custom behaviors
7
+
1
8
  * 1.0.1 - 08-09-2010
2
9
  * Added /[user]/login and /[user]/logout to routes ([user]_login_path and [user]_logout_path, respectively)
3
10
 
data/README.rdoc CHANGED
@@ -1,6 +1,132 @@
1
1
  = sparkly-auth
2
2
 
3
- Description goes here.
3
+ Rails authentication -- with sparkles!
4
+
5
+ == about the gem
6
+
7
+ After playing with a bunch of other auth gems out there, in the end I decided I had to roll my own. Unlike the
8
+ others (and the reason I undertook this task), Sparkly Auth errs on the side of security. By default, (that is,
9
+ unless you go changing configuration options that water down its auth mechanisms), this gem produces a PCI/DSS-
10
+ compliant authentication scheme which I'm now putting to work at my Real Job at Ingenico (www.ingenico.com). (We
11
+ now have two Web-based payment applications depending on Sparkly Auth.)
12
+
13
+ There is an ongoing battle between security and convenience. They say you can pick one, but not both. While
14
+ I'm not going to claim that Sparkly singlehandedly settles this dispute, I will say that Sparkly lets you choose
15
+ between varying shades of gray, rather than choosing between black and white. Sparkly Auth provides a plethora of
16
+ configuration options to let you apply a more user-friendly authentication solution to your site, while making
17
+ it crystal clear what the security tradeoff will be.
18
+
19
+ Sparkly supports multiple user models, multiple controllers, and all that jazz -- but doesn't force it on you.
20
+ A default value is provided for virtually every possible option, and the options are conveniently tucked away
21
+ in the class documentation -- there for you when you need it, but not breathing down your neck when you don't.
22
+
23
+ === what does security mean?
24
+
25
+ So that's the high level overview. If you've read this far then maybe you're wondering exactly what kind of
26
+ authentication security Sparkly Auth brings to the table. Well, here's The List. Some other solutions out there
27
+ cover portions of it; others cover other portions. But I've yet to find one (besides Sparkly) that does it all.
28
+
29
+ One last disclaimer: all of this can be modified or disabled entirely. So don't think that because it's listed
30
+ here, dependencies HAVE to use it. I've got a number of side apps written that use Sparkly but, for example,
31
+ completely disable the password update policy.
32
+
33
+ * Enforces a strong password policy by default (7-digit uppercase, lowercase and numeric)
34
+ * Enforces a periodic password update (once every 30 days)
35
+ * Enforces a unique password (can't match any of the previous 4 passwords by default)
36
+ * Automatically signs the user out after 30 minutes of inactivity
37
+ * Provides secure single-access tokens for authentication without cookies (e.g. Web Service consumers)
38
+ * Locks an account for 30 minutes after 5 invalid login attempts
39
+ * Provides generators for controllers and views, so that you can add (or remove) layers quickly and painlessly
40
+ -- even on a per-model or per-controller basis, if your application uses more than one
41
+ * Allows you to change which parent controller has access to the logged-in user (defaults to ApplicationController)
42
+ * Behaviors (including even the core behavior) are plug-and-play and can be easily swapped in/out, and custom
43
+ behaviors can be added
44
+ * Encryption methods can be easily replaced
45
+
46
+
47
+ Since my own personal use cases for Sparkly Auth vary widely, so do its capabilities. Not only can the above
48
+ be disabled, but it also sports (for example) a "Remember Me" checkbox that would otherwise circumvent some
49
+ of the above precautions. Obviously, the checkbox is disabled by default.
50
+
51
+ == installation
52
+
53
+ In Rails 2, add "sparkly-auth" to your gem dependencies:
54
+ config.gem 'sparkly-auth'
55
+
56
+ In Rails 3, add "sparkly-auth" to your Gemfile:
57
+ gem 'sparkly-auth'
58
+
59
+ == setting up
60
+
61
+ (In the examples below, replace 'script/generate' with 'rails generate' if you're using Rails 3.)
62
+
63
+ For a step-by-step guide, run
64
+
65
+ script/generate sparkly help
66
+
67
+ Basically, the you have to run
68
+
69
+ script/generate sparkly config
70
+ script/generate sparkly migrations
71
+
72
+ and optionally (if you plan to override the controllers and/or views),
73
+
74
+ script/generate sparkly controllers
75
+ script/generate sparkly views
76
+
77
+ Assuming you have a User model (or that you've edited config/initializers/sparkly_authentication.rb to taste),
78
+ you should be ready to go!
79
+
80
+ You should take a quick gander at config/initializers/sparkly_authentication.rb just to see what's in there.
81
+
82
+ == routes
83
+
84
+ Unless you disable them, Sparkly Auth will automatically generate a set of routes for its controllers. Run
85
+
86
+ rake routes
87
+
88
+ and you should see something like this:
89
+
90
+ new_user_session GET /user/session/new(.:format)
91
+ edit_user_session GET /user/session/edit(.:format)
92
+ user_session GET /user/session(.:format)
93
+ PUT /user/session(.:format)
94
+ DELETE /user/session(.:format)
95
+ POST /user/session(.:format)
96
+ user_login /user/login
97
+ user_logout /user/logout
98
+ new_user GET /user/new(.:format)
99
+ edit_user GET /user/edit(.:format)
100
+ user GET /user(.:format)
101
+ PUT /user(.:format)
102
+ DELETE /user(.:format)
103
+ POST /user(.:format)
104
+ /:controller/:action/:id
105
+ /:controller/:action/:id(.:format)
106
+
107
+ This assumes you're authenticating against a single User model. Obviously, if you're authenticating against
108
+ a different model (or more than one), the routes will be changed to suit.
109
+
110
+ == migration
111
+
112
+ I'm working on rake tasks that help you migrate from other authentication solutions to Sparkly Auth, largely
113
+ because I had to do so myself. So without further ado, here's how you can do that:
114
+
115
+ === Authlogic
116
+
117
+ After running the various Sparkly migrations, simply run:
118
+
119
+ rake auth:migrate:authlogic
120
+
121
+ Done.
122
+
123
+ If you've set up an Authlogic encryptor other than SHA512, you'll want to use that encryptor for Sparkly. In
124
+ this case, don't disable Authlogic the dependency (but DO remove the various hooks from your code), and in your
125
+ config/initializers/sparkly_authentication.rb file, add the following line:
126
+
127
+ config.encryptor = Authlogic::CryptoProviders::Wordpress # or whatever.
128
+
129
+ That should be it (it was for me). If you have any troubles, drop me a line so I can update this documentation!
4
130
 
5
131
  == Note on Patches/Pull Requests
6
132
 
data/Rakefile CHANGED
@@ -6,33 +6,47 @@ begin
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "sparkly-auth"
8
8
  gem.summary = %Q{User authentication with Sparkles!}
9
- gem.description = %Q{As fate would have it, I found other authentication solutions unable to suit my needs. So I rolled my own.}
9
+ gem.description = %Q{As fate would have it, I found other authentication solutions unable to suit my needs. So I rolled my own, totally supporting Rails 2 AND 3.}
10
10
  gem.email = "sinisterchipmunk@gmail.com"
11
11
  gem.homepage = "http://www.thoughtsincomputation.com"
12
12
  gem.authors = ["Colin MacKenzie IV"]
13
- gem.add_dependency "sc-core-ext", ">= 1.2.0"
13
+ gem.add_dependency "sc-core-ext", ">= 1.2.1"
14
14
  gem.add_development_dependency 'rspec-rails', '>= 1.3.2'
15
15
  gem.add_development_dependency 'webrat', '>= 0.7.1'
16
16
  gem.add_development_dependency 'genspec', '>= 0.1.1'
17
17
  gem.add_development_dependency 'email_spec', '>= 0.6.2'
18
18
  # WHY does jeweler insist on using test/* files? THEY DON'T EXIST!
19
- gem.test_files = FileList['spec/**/*']
19
+ gem.test_files = FileList['spec/**/*'] + FileList['spec_env/**/*'] + FileList['features/**/*']
20
20
  end
21
21
  Jeweler::GemcutterTasks.new
22
22
  rescue LoadError
23
23
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
24
24
  end
25
25
 
26
- require 'spec/rake/spectask'
27
- Spec::Rake::SpecTask.new(:spec) do |spec|
28
- spec.libs << 'lib' << 'spec'
29
- spec.spec_files = FileList['spec/**/*_spec.rb']
30
- end
31
-
32
- Spec::Rake::SpecTask.new(:rcov) do |spec|
33
- spec.libs << 'lib' << 'spec'
34
- spec.pattern = 'spec/**/*_spec.rb'
35
- spec.rcov = true
26
+ begin
27
+ require 'spec/rake/spectask'
28
+ Spec::Rake::SpecTask.new(:spec) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.spec_files = FileList['spec/**/*_spec.rb']
31
+ end
32
+
33
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
34
+ spec.libs << 'lib' << 'spec'
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ spec.rcov_opts = %w{--rails --exclude osx\/objc,gems\/,spec\/,features\/}
38
+ end
39
+ rescue LoadError
40
+ require 'rspec/core/rake_task'
41
+ RSpec::Core::RakeTask.new(:spec) do |spec|
42
+ spec.pattern = "spec/**/*_spec.rb"
43
+ end
44
+
45
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
46
+ spec.pattern = "spec/**/*_spec.rb"
47
+ spec.rcov = true
48
+ spec.rcov_opts = %w{--rails --exclude osx\/objc,gems\/,spec\/,features\/}
49
+ end
36
50
  end
37
51
 
38
52
  task :spec => :check_dependencies
@@ -46,5 +60,23 @@ Rake::RDocTask.new do |rdoc|
46
60
  rdoc.rdoc_dir = 'rdoc'
47
61
  rdoc.title = "sparkly-auth #{version}"
48
62
  rdoc.rdoc_files.include('README*')
63
+ rdoc.rdoc_files.include('HISTORY*')
64
+ rdoc.rdoc_files.include('LICENSE*')
49
65
  rdoc.rdoc_files.include('lib/**/*.rb')
50
66
  end
67
+
68
+ # Haven't got this working yet.
69
+ #namespace :spec do
70
+ # desc "runs specs, and if they pass, runs Rails2 specs and then Rails3 specs."
71
+ # task :all => [:spec, :rails2, :rails3]
72
+ #
73
+ # desc "runs Rails2 specs"
74
+ # task :rails2 do
75
+ # system("cd spec/support/rails2 && spec spec -c && cucumber")
76
+ # end
77
+ #
78
+ # desc "runs Rails3 specs"
79
+ # task :rails3 do
80
+ # system("cd spec/support/rails3 && rspec spec -c && cucumber")
81
+ # end
82
+ #end
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ * Rememberable behavior
2
+ * current_user helper delegated to Views
3
+ * Confirmation behavior
4
+ * A generic login form partial to be rendered anywhere
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.1.0
@@ -1,5 +1,4 @@
1
1
  class SparklyAccountsController < SparklyController
2
- unloadable
3
2
  require_login_for :show, :edit, :update, :destroy
4
3
 
5
4
  # GET new_model_url
@@ -9,8 +8,8 @@ class SparklyAccountsController < SparklyController
9
8
  # POST model_url
10
9
  def create
11
10
  if model.save
12
- login!(model)
13
- redirect_back_or_default Auth.default_destination, Auth.account_created_message
11
+ login!(model) if sparkly_config.login_after_signup
12
+ redirect_back_or_default sparkly_config.default_destination, sparkly_config.account_created_message
14
13
  else
15
14
  render :action => 'new'
16
15
  end
@@ -32,7 +31,7 @@ class SparklyAccountsController < SparklyController
32
31
  end
33
32
 
34
33
  if model.save
35
- redirect_back_or_default user_path, Auth.account_updated_message
34
+ redirect_back_or_default user_path, sparkly_config.account_updated_message
36
35
  else
37
36
  render :action => 'edit'
38
37
  end
@@ -43,17 +42,25 @@ class SparklyAccountsController < SparklyController
43
42
  current_user && current_user.destroy
44
43
  logout!
45
44
  @current_user = nil
46
- flash[:notice] = Auth.account_deleted_message
47
- redirect_back_or_default Auth.default_destination
45
+ flash[:notice] = sparkly_config.account_deleted_message
46
+ redirect_back_or_default sparkly_config.default_destination
48
47
  end
49
48
 
50
49
  protected
51
- def find_user_model
52
- # password fields are protected attrs, so we need to exclude them then add them explicitly.
53
- self.model_instance = current_user ||
54
- returning(model_class.new(model_params.without(:password, :password_confirmation))) { |model|
55
- model.password = model_params[:password]
56
- model.password_confirmation = model_params[:password_confirmation]
57
- }
50
+ def find_user_model
51
+ # password fields are protected attrs, so we need to exclude them then add them explicitly.
52
+ self.model_instance = current_user || begin
53
+ model = model_class.new(model_params.without(:password, :password_confirmation))
54
+ model.password = model_params[:password]
55
+ model.password_confirmation = model_params[:password_confirmation]
56
+ model
58
57
  end
58
+ end
59
+
60
+ # Uncomment if you don't trust the params[:model] set up by Sparkly routing, or if you've
61
+ # disabled them.
62
+ #
63
+ #def model_name
64
+ # "User"
65
+ #end
59
66
  end
@@ -1,7 +1,6 @@
1
1
  class SparklyController < (Auth.base_controller)
2
- unloadable
3
2
  helper_method :model_class, :model_instance, :model_name, :model, :model_path, :new_model_path, :edit_model_path,
4
- :model_config, :model_session_path, :model_params
3
+ :model_config, :model_session_path, :model_params, :sparkly_config, :auth_config
5
4
  before_filter :find_user_model
6
5
 
7
6
  protected
@@ -36,12 +35,14 @@ class SparklyController < (Auth.base_controller)
36
35
  end
37
36
 
38
37
  def model_config
39
- Auth.configuration.for_model(model_name)
38
+ model_class.sparkly_config
40
39
  end
41
40
 
42
41
  def model_params
43
42
  params[model_name.underscore] || {}
44
43
  end
45
44
 
46
- alias_method :model, :model_instance
45
+ alias_method :model, :model_instance
46
+ alias_method :auth_config, :model_config
47
+ alias_method :sparkly_config, :model_config
47
48
  end
@@ -1,14 +1,14 @@
1
1
  class SparklySessionsController < SparklyController
2
- unloadable
3
-
2
+ require_logout_for :new, :create
3
+
4
4
  # GET new_model_session_url
5
5
  def new
6
6
  end
7
7
 
8
8
  # POST model_session_url
9
9
  def create
10
- if session[:locked_out_at] && session[:locked_out_at] > Auth.account_lock_duration.ago
11
- flash[:error] = Auth.account_locked_message
10
+ if session[:locked_out_at] && session[:locked_out_at] > sparkly_config.account_lock_duration.ago
11
+ flash[:error] = sparkly_config.account_locked_message
12
12
  render :action => 'new'
13
13
  return
14
14
  end
@@ -18,14 +18,14 @@ class SparklySessionsController < SparklyController
18
18
 
19
19
  if model && model.password_matches?(model_params[:password])
20
20
  login! model, :remember => remember_me?
21
- redirect_back_or_default Auth.default_destination, Auth.login_successful_message
21
+ redirect_back_or_default sparkly_config.default_destination, sparkly_config.login_successful_message
22
22
  else
23
23
  session[:login_failures] = session[:login_failures].to_i + 1
24
- if Auth.max_login_failures && session[:login_failures] >= Auth.max_login_failures
24
+ if sparkly_config.max_login_failures && session[:login_failures] >= sparkly_config.max_login_failures
25
25
  session[:locked_out_at] = Time.now
26
- flash[:error] = Auth.account_locked_message
26
+ flash[:error] = sparkly_config.account_locked_message
27
27
  else
28
- flash[:error] = Auth.invalid_credentials_message
28
+ flash[:error] = sparkly_config.invalid_credentials_message
29
29
  end
30
30
  render :action => "new"
31
31
  end
@@ -34,10 +34,17 @@ class SparklySessionsController < SparklyController
34
34
  # DELETE model_session_url
35
35
  def destroy
36
36
  logout!(:forget => true)
37
- redirect_back_or_default Auth.default_destination, Auth.logout_message
37
+ redirect_back_or_default sparkly_config.default_destination, sparkly_config.logout_message
38
38
  end
39
39
 
40
40
  private
41
+ # Uncomment if you don't trust the params[:model] set up by Sparkly routing, or if you've
42
+ # disabled them.
43
+ #
44
+ #def model_name
45
+ # "User"
46
+ #end
47
+
41
48
  def remember_me?
42
49
  remembrance = model_params[:remember_me]
43
50
  if remembrance.kind_of?(String)
@@ -0,0 +1,2 @@
1
+ module SparklyAccountsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module SparklyHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module SparklySessionsHelper
2
+ end
@@ -9,7 +9,9 @@ class RemembranceToken < ActiveRecord::Base
9
9
  "#{authenticatable_type}|#{authenticatable_id}|#{series_token}|#{remembrance_token}"
10
10
  end
11
11
 
12
- def before_validation
12
+ before_validation :regenerate_remembrance_token
13
+
14
+ def regenerate_remembrance_token
13
15
  regenerate if new_record?
14
16
  end
15
17
 
@@ -0,0 +1,24 @@
1
+ <%form_for model, :url => model_path do |f|%>
2
+ <p>
3
+ <%=f.error_messages%>
4
+ </p>
5
+
6
+ <p>
7
+ <%=f.label model_config.key%><br/>
8
+ <%=f.text_field model_config.key%>
9
+ </p>
10
+
11
+ <p>
12
+ <%=f.label :password%><br/>
13
+ <%=f.password_field :password, :value => ''%>
14
+ </p>
15
+
16
+ <p>
17
+ <%=f.label :password_confirmation%><br/>
18
+ <%=f.password_field :password_confirmation, :value => ''%>
19
+ </p>
20
+
21
+ <p>
22
+ <%=f.submit(model.new_record? ? "Sign up" : "Update Profile")%>
23
+ </p>
24
+ <%end%>