[Cascavel-pm] Catalyst: Autentication

Giuliani Sanches giulianisanches em gmail.com
Quinta Junho 3 16:50:39 PDT 2010


Em 27 de maio de 2010 10:14, Ednardo Lobo <ednardo em lobo.eti.br> escreveu:
> Giuliani,
>
> Seguem esquemas complementares:
>
> - Role
>
> ------------------------------------------------------------------------
> __PACKAGE__->load_components("Core");
> __PACKAGE__->table("role");
> __PACKAGE__->add_columns(
>  "id",
>  { data_type => "INT", default_value => undef, is_nullable => 0, size => 11
> },
>  "role",
>  {
>    data_type => "TEXT",
>    default_value => undef,
>    is_nullable => 1,
>    size => 65535,
>  },
> );
> __PACKAGE__->set_primary_key("id");
> ------------------------------------------------------------------------
>
> - UserRole
>
> ------------------------------------------------------------------------
> __PACKAGE__->load_components("Core");
> __PACKAGE__->table("user_role");
> __PACKAGE__->add_columns(
>  "user_id",
>  { data_type => "INT", default_value => 0, is_nullable => 0, size => 11 },
>  "role_id",
>  { data_type => "INT", default_value => 0, is_nullable => 0, size => 11 },
> );
> __PACKAGE__->set_primary_key("user_id", "role_id");
>
> __PACKAGE__->belongs_to(user => 'sgle::Schema::User', 'user_id');
> __PACKAGE__->belongs_to(role => 'sgle::Schema::Role', 'role_id');
> ------------------------------------------------------------------------
>
> Precisando de qualquer outra informação, é só solicitar.
>
> Agradeço desde já sua ajuda!
>
> Giuliani Sanches escreveu:
>>
>> Em 27 de maio de 2010 07:55, Ednardo Lobo <ednardo em lobo.eti.br> escreveu:
>>>
>>> Giuliani,
>>>
>>> Ajustei meu "realm" para:
>>>
>>> <Plugin::Authentication>
>>>   default_realm default
>>>   <realms>
>>>       <default>
>>>           <credential>
>>>               class Password
>>>               password_field password
>>>               password_type clear
>>>           </credential>
>>>           <store>
>>>               class DBIx::Class
>>>               user_model sgle::Schema::User
>>>               role_relation roles
>>>               role_field role
>>>           </store>
>>>       </default>
>>>   </realms>
>>> </Plugin::Authentication>
>>>
>>> Não consegui, entretanto, compreender o que é exatamente o "user_model",
>>>  cuja definição extraída do manual reproduzo a seguir:
>>>
>>> ------------------------------------------------------------------------
>>> user_model
>>>
>>> Contains the model name (as passed to $c->model()) of the DBIx::Class
>>> schema
>>> to use as the source for user information. This config item is REQUIRED.
>>>
>>> (Note that this option used to be called user_class. user_class is still
>>> functional, but should be used only for compatibility with previous
>>> configs.
>>> The setting called user_class on other authentication stores is present,
>>> but
>>> named store_user_class in this store)
>>> ------------------------------------------------------------------------
>>>
>>> Informei, porém, a classe que refere-se ao esquema da minha tabela de
>>> usuários onde fica registrado o "username" e "password", veja:
>>>
>>> ------------------------------------------------------------------------
>>> __PACKAGE__->load_components("Core");
>>> __PACKAGE__->table("user");
>>> __PACKAGE__->add_columns(
>>>  "id",
>>>  { data_type => "INT", default_value => undef, is_nullable => 0, size =>
>>> 11
>>> },
>>>  "username",
>>>  {
>>>   data_type => "TEXT",
>>>   default_value => undef,
>>>   is_nullable => 1,
>>>   size => 65535,
>>>  },
>>>  "password",
>>>  {
>>>   data_type => "TEXT",
>>>   default_value => undef,
>>>   is_nullable => 1,
>>>   size => 65535,
>>>  },
>>>  "email_address",
>>>  {
>>>   data_type => "TEXT",
>>>   default_value => undef,
>>>   is_nullable => 1,
>>>   size => 65535,
>>>  },
>>>  "first_name",
>>>  {
>>>   data_type => "TEXT",
>>>   default_value => undef,
>>>   is_nullable => 1,
>>>   size => 65535,
>>>  },
>>>  "last_name",
>>>  {
>>>   data_type => "TEXT",
>>>   default_value => undef,
>>>   is_nullable => 1,
>>>   size => 65535,
>>>  },
>>>  "active",
>>>  { data_type => "INT", default_value => undef, is_nullable => 1, size =>
>>> 11
>>> },
>>> );
>>>
>>> __PACKAGE__->set_primary_key("id");
>>>
>>> __PACKAGE__->has_many(user_roles => 'sgle::Schema::UserRole', 'user_id');
>>> __PACKAGE__->many_to_many(roles => 'user_roles', 'role');
>>> ------------------------------------------------------------------------
>>>
>>> Entretanto, quando a ação "Controller::Login" é tomada apenas a tabela
>>> 'role' é acessada, veja:
>>>
>>> ------------------------------------------------------------------------
>>> SELECT me.id, me.role FROM role me
>>> ------------------------------------------------------------------------
>>>
>>> E não consegui descobrir a razão disto. Esperava que tabela 'user' também
>>> fosse acessada.
>>>
>>> Onde estou errando?
>>>
>>>
>>> Grato,
>>>
>>>
>>> Giuliani Sanches escreveu:
>>>>
>>>> Em 26 de maio de 2010 14:33, Ednardo Lobo <ednardo em lobo.eti.br>
>>>> escreveu:
>>>>>
>>>>> Giuliani,
>>>>>
>>>>> O "default realm" está configurado, veja:
>>>>>
>>>>> - sgle.conf
>>>>>
>>>>> <Plugin::Authentication>
>>>>>  <default>
>>>>>      password_type   clear
>>>>>      user_model   DB::User
>>>>>      class   SimpleDB
>>>>>  </default>
>>>>> </Plugin::Authentication>
>>>>>
>>>>>
>>>>> Li o artigo e a documentação que indicou, mas não ajudaram.
>>>>>
>>>>> Alguma outra sugestão?
>>>>>
>>>>>
>>>>> Grato,
>>>>>
>>>>> Giuliani Sanches escreveu:
>>>>>>
>>>>>> 2010/5/26 Ednardo Lobo <ednardo em lobo.eti.br>:
>>>>>>>
>>>>>>> Pessoal,
>>>>>>>
>>>>>>> Estou testando o módulo Catalyst::Plugin::Autentication e não estou
>>>>>>> conseguindo identificar a origem do erro:
>>>>>>>
>>>>>>> --------------
>>>>>>> Caught exception in sgle::Controller::Login->index "authenticate
>>>>>>> called
>>>>>>> with
>>>>>>> nonexistant realm: 'default'. at
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> /home/ftp/www/lobosnet.cjb.net/sgle/script/../lib/sgle/Controller/Login.pm
>>>>>>> line 30"
>>>>>>> --------------
>>>>>>>
>>>>>>> Isso ocorre quando a seguinte ação é tomada:
>>>>>>>
>>>>>>> - Login.pm
>>>>>>>
>>>>>>> sub index :Path :Args(0) {
>>>>>>>  my ( $self, $c ) = @_;
>>>>>>>
>>>>>>>  my $u = $c->req->params->{username};
>>>>>>>  my $p = $c->req->params->{password};
>>>>>>>
>>>>>>>  if ($u && $p) {
>>>>>>>     if ($c->authenticate({username => $u, password => $p})) {
>>>>>>>         $c->res->redirect('Welcome');
>>>>>>>     }
>>>>>>>     else {
>>>>>>>         $c->stash(error_msg => "Bad username or password.");
>>>>>>>     }
>>>>>>>  }
>>>>>>>  else {
>>>>>>>     $c->stash(error_msg => "Empty username or password.");
>>>>>>>  }
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> Qualquer palpite é bem-vindo!
>>>>>>>
>>>>>>>
>>>>>>> Grato,
>>>>>>
>>>>>> Hum.. a mensagem deixa bem claro que faltou configurar o realm
>>>>>> default.
>>>>>>
>>>>>> Da uma olhada no primeiro exemplo da documentação do plugin:
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> http://search.cpan.org/~flora/Catalyst-Plugin-Authentication-0.10016/lib/Catalyst/Plugin/Authentication.pm#EXAMPLE
>>>>>>
>>>>>> Tem também esse ótimo artigo do Wallace Reis no sao-paullo.pm.org:
>>>>>>
>>>>>> http://sao-paulo.pm.org/artigo/2010/AutenticacaoCatalyst
>>>>>>
>>>>>> []'s
>>>>
>>>> Senti falta do Credential e Store na sua configuração.
>>>>
>>>>
>>>>
>>>> http://search.cpan.org/~flora/Catalyst-Plugin-Authentication-0.10016/lib/Catalyst/Plugin/Authentication.pm#Credential_Verifiers
>>>>
>>>> []'s
>>>>
>>>
>>> --
>>>   Ednardo Lobo
>>>
>>>   www.lobo.eti.br
>>> _______________________________________________
>>> Cascavel-pm mailing list
>>> Cascavel-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>>
>>
>>
>> Manda o código do teu Schema::UserRole.
>>
>> Até o inicio da tarde eu consigo dar uma olhada com calma e tento te
>> ajudar.
>>
>> []'s
>
>
> --
>    Ednardo Lobo
>
>    www.lobo.eti.br
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>

Ednardo,

Desculpe a demora em responder, mas os ultimos dias foram bem tensos
em todos as áreas do meu dia a dia e somente nesse momento consegui
dar uma olhada nisso.

Como estou com preguiça e achei mais rápido e prático refazer os
seguintes passos:

http://search.cpan.org/~hkclark/Catalyst-Manual-5.8004/lib/Catalyst/Manual/Tutorial/04_BasicCRUD.pod
http://search.cpan.org/~hkclark/Catalyst-Manual-5.8004/lib/Catalyst/Manual/Tutorial/05_Authentication.pod

ao invés de analisar seus "schemas", para ver se ao menos eu conseguia
gerar a aplicação e fazer funcionar o esquema de autenticação.

Eu consegui montar a app com a autenticação sem problemas. Utilizei o
postgresql, baseado nas instruções oferecidas aqui:

http://search.cpan.org/~hkclark/Catalyst-Manual-5.8004/lib/Catalyst/Manual/Tutorial/10_Appendices.pod

Apesar de não estar te apontando a solução exata, espero que isso
ajude (apesar de você ter dito que já havia lido o tutorial, mas
enfim, as vezes alguma detalhes passa em branco  ;) ).

[]'s

-- 
Giuliani Sanches
twitter.com/giulianisanches
giulianisanches.blogspot.com

Como elaborar uma pergunta:
http://www.istf.com.br/perguntas/


Mais detalhes sobre a lista de discussão Cascavel-pm