package AppName; use Modern::Perl; use Mojo::Base 'Mojolicious'; use utf8; # This method will run once at server start sub startup { my $self = shift; $self->plugin('AppName::Helpers::Core'); # my $r = $self->routes; # # # user_id isAdmin, - $r->add_condition( isAdmin => sub { my ($route, $c, $captures, $pattern) = @_; return 1 if $c->isAdmin($c->session->{'user_id'}); return undef; } ); # GET- /users users sd isAdmin - $r->get('/users')->over(isAdmin => 1)->to('sd#users'); # - , - 404 $r->any('/(*everything')->to('user#main'); } 1;
package AppName::Helpers::Core; use base 'Mojolicious::Plugin'; use Modern::Perl; sub register { my ($self, $app) = @_; $app->helper( isAdmin => sub { # , # invocation: # $whatever->isAdmin($user_login) # outputs: 1|2, undef my ($self, $user_login) = @_; return 1 if $user_login eq $user foreach (@{$self->config->{PrivilegedUsers}->{Administrators}}); return 2 if $user_login eq $manager foreach (@{$self->config->{PrivilegedUsers}->{Managers}}); return undef; } ); } 1;
$self->plugin('authentication', autoload_user => 1, # , $c->current_user load_user => sub { my $self = shift; my $uid = shift; return { 'id' => $uid, 'name' => $self->session->{'user_id'}, } if $uid; return undef; }, validate_user => sub { # my $self = shift; my $username = shift || ''; my $password = shift || ''; my $extradata = shift || {}; my $user = $self->APIrequest(...); # - , - if (ref($user) eq 'HASH') { $self->error("API internal error while logging in user: ".$username); return undef; } if ($user->[0] !~ m/^Error:/) { $self->session->{'user_id'} = $username; return $user->[0]; } $self->info("Login for user '$username' failed: $user->[0]"); return undef; } );
$r->get('/users')->over(authenticated => 1)->over(isAdmin => 1)->to('sd#users');
$ ./AppName GetCMDB -h Usage: APPLICATION GetCMDB
$self->hook(before_render => sub { my ($c, $args) = @_; if ($args->{'exception'}) { # , %snapshot my %snapshot = map {$_ => $c->stash->{$_}} grep {!/mojo.active_session|mojo.captures|mojo.routed|mojo.secrets|mojo.started|^config$|^exception$/ and defined $c->stash->{$_}} keys %{$c->stash}; # Redmine $c->RedmineReport(); } # $c->stash(snapshot => { map {$_ => $c->stash->{$_}} grep {!/mojo.active_session|mojo.captures|mojo.routed|mojo.secrets|mojo.started|^config$|^exception$/ and defined $c->stash->{$_}} keys %{$c->stash} }); return; });
# Core.pm, Lib.pm, CMDB.pm AppName/lib/Helpers $self->plugin('AppName::Helpers::Core'); $self->plugin('AppName::Helpers::Lib'); $self->plugin('AppName::Helpers::CMDB'); # AppName/lib/Controllers $r = $r->namespaces(['AppName::Controllers']);
Source: https://habr.com/ru/post/244317/