Skip to content

Commit 4d4c36e

Browse files
committed
Implement disable_roles in plugin closes GH #38.
1 parent 7486abb commit 4d4c36e

File tree

4 files changed

+158
-3
lines changed

4 files changed

+158
-3
lines changed

MANIFEST

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
README
22
t/00-load.t
33
t/01-role-provider.t
4+
t/disable_roles.t
45
t/plugin-provider-config.t
6+
t/lib/environments/disable-roles.yml
57
t/lib/environments/provider-config.yml
68
t/lib/Provider/ConfigExtended.pm
79
t/lib/views/.placeholder

lib/Dancer2/Plugin/Auth/Extensible.pm

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,11 +487,17 @@ sub password_reset_send {
487487
}
488488

489489
sub require_all_roles {
490-
return _build_wrapper( @_, 'all' );
490+
my $plugin = shift;
491+
croak "Cannot use require_all_roles since roles are disabled by disable_roles setting"
492+
if $plugin->disable_roles;
493+
return $plugin->_build_wrapper( @_, 'all' );
491494
}
492495

493496
sub require_any_role {
494-
return _build_wrapper( @_, 'any' );
497+
my $plugin = shift;
498+
croak "Cannot use require_any_role since roles are disabled by disable_roles setting"
499+
if $plugin->disable_roles;
500+
return $plugin->_build_wrapper( @_, 'any' );
495501
}
496502

497503
sub require_login {
@@ -521,7 +527,10 @@ sub require_login {
521527
}
522528

523529
sub require_role {
524-
return _build_wrapper( @_, 'single' );
530+
my $plugin = shift;
531+
croak "Cannot use require_role since roles are disabled by disable_roles setting"
532+
if $plugin->disable_roles;
533+
return $plugin->_build_wrapper( @_, 'single' );
525534
}
526535

527536
sub update_current_user {
@@ -555,6 +564,8 @@ sub update_user {
555564

556565
sub user_has_role {
557566
my $plugin = shift;
567+
croak "Cannot call user_has_role since roles are disabled by disable_roles setting"
568+
if $plugin->disable_roles;
558569

559570
my ( $username, $want_role );
560571
if ( @_ == 2 ) {
@@ -661,6 +672,8 @@ sub user_password {
661672

662673
sub user_roles {
663674
my ( $plugin, $username, $realm ) = @_;
675+
croak "Cannot call user_roles since roles are disabled by disable_roles setting"
676+
if $plugin->disable_roles;
664677

665678
$username = $plugin->app->session->read('logged_in_user')
666679
unless defined $username;
@@ -1721,6 +1734,9 @@ In your application's configuation file:
17211734
plugins:
17221735
Auth::Extensible:
17231736
# Set to 1 if you want to disable the use of roles (0 is default)
1737+
# If roles are disabled then any use of role-based route decorators
1738+
# will cause app to croak on load. Use of 'user_roles' and
1739+
# 'user_has_role' will croak at runtime.
17241740
disable_roles: 0
17251741
# After /login: If no return_url is given: land here ('/' is default)
17261742
user_home_page: '/user'

t/disable_roles.t

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
use Test::More;
2+
use Test::Fatal;
3+
use Plack::Test;
4+
use HTTP::Request::Common;
5+
6+
BEGIN {
7+
$ENV{DANCER_CONFDIR} = 't/lib';
8+
$ENV{DANCER_ENVIRONMENT} = 'disable-roles';
9+
}
10+
11+
like exception {
12+
package RequireAllRoles;
13+
use Dancer2;
14+
use Dancer2::Plugin::Auth::Extensible;
15+
16+
get '/require_all_roles' => require_all_roles [qw(Foo Bar)] => sub {
17+
return 1;
18+
};
19+
},
20+
qr/roles are disabled by disable_roles setting/,
21+
"App using require_all_roles dies during route setup";
22+
23+
24+
like exception {
25+
package RequireAnyRole;
26+
use Dancer2;
27+
use Dancer2::Plugin::Auth::Extensible;
28+
29+
get '/require_any_role' => require_any_role [qw(Foo Bar)] => sub {
30+
return 1;
31+
};
32+
},
33+
qr/roles are disabled by disable_roles setting/,
34+
"App using require_any_role dies during route setup";
35+
36+
like exception {
37+
package RequireRole;
38+
use Dancer2;
39+
use Dancer2::Plugin::Auth::Extensible;
40+
41+
get '/require_role' => require_role Foo => sub {
42+
return 1;
43+
};
44+
},
45+
qr/roles are disabled by disable_roles setting/,
46+
"App using require_role dies during route setup";
47+
48+
{
49+
package TestApp;
50+
use Dancer2;
51+
use Dancer2::Plugin::Auth::Extensible;
52+
53+
set logger => 'capture';
54+
set log => 'error';
55+
56+
get '/user_has_role' => sub {
57+
user_has_role('Foo');
58+
return 1;
59+
};
60+
61+
get '/user_roles' => sub {
62+
user_roles;
63+
return 1;
64+
};
65+
}
66+
67+
my $app = TestApp->to_app;
68+
is( ref $app, 'CODE', 'Got app' );
69+
70+
my $test = Plack::Test->create($app);
71+
my $trap = TestApp->dancer_app->logger_engine->trapper;
72+
73+
my ($log, $res);
74+
75+
$res = $test->request(GET "/user_has_role");
76+
77+
ok !$res->is_success, "GET /user_has_role request does not return success";
78+
79+
is $res->code, 500, "... and the error code is 500";
80+
81+
$log = $trap->read->[0];
82+
like $log->{message},qr/Cannot call user_has_role since roles are disabled/,
83+
"... and we have a log message saying that roles are disabled";
84+
85+
is $log->{level}, 'error', "... and the log level is error.";
86+
87+
$res = $test->request(GET "/user_roles");
88+
89+
ok !$res->is_success, "GET /user_roles request does not return success";
90+
91+
is $res->code, 500, "... and the error code is 500";
92+
93+
$log = $trap->read->[0];
94+
like $log->{message},qr/Cannot call user_roles since roles are disabled/,
95+
"... and we have a log message saying that roles are disabled";
96+
97+
is $log->{level}, 'error', "... and the log level is error.";
98+
99+
done_testing;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
plugins:
2+
Auth::Extensible:
3+
disable_roles: 1
4+
realms:
5+
config1:
6+
provider: Config
7+
users:
8+
- user: dave
9+
pass: beer
10+
name: "David Precious"
11+
roles:
12+
- BeerDrinker
13+
- Motorcyclist
14+
- user: bob
15+
pass: cider
16+
name: "Bob Smith"
17+
roles:
18+
- CiderDrinker
19+
- user: mark
20+
pass: wantscider
21+
name: "Update here"
22+
config2:
23+
provider: Config
24+
priority: 10
25+
users:
26+
- user: burt
27+
pass: bacharach
28+
- user: hashedpassword
29+
pass: "{SSHA}+2u1HpOU7ak6iBR6JlpICpAUvSpA/zBM"
30+
- user: mark
31+
pass: wantscider
32+
name: "Update here"
33+
config3:
34+
provider: Config
35+
priority: 2
36+
users:
37+
- user: bananarepublic
38+
pass: whatever

0 commit comments

Comments
 (0)