Ajuda com modelagem em um CRUD

18 views
Skip to first unread message

Rodrigo Braga

unread,
Dec 27, 2011, 6:21:40 PM12/27/11
to .NET BR
Pessoal

Uma ajuda, que imagino eu, seja até boba, mas como perguntar não ofende, sigamos!

Estou olhando um projeto (CRUD, MVC e EF) onde querem expandi-lo para outras interfaces (inicialmente mobile, web app); e em várias partes do projeto, algumas regras estão no controller; temos o seguinte o cenário: uma classe Empresa possui uma coleção de Alocações e Serviços, uma propriedade em Alocação determina se "perfil" do usuário, como por exemplo Administrador, Vendedor e etc., pode executar aquela recurso.

Porém e essa verificação está sendo feita no controller.

O que irá gerar retrabalho...

Quais as opções para contornar isso?

Eu imaginei o seguinte, no método para inserção de novos serviços, além de passar o serviço a ser adicionado, passar em um segundo parâmetro uma instância da alocação (que seria o usuário) que está executando a operação e fazer essa verificação das permissões nessa método.

Seria essa uma boa saída? Quais as opções e alternativas?

Valeu

--
Att.,
Rodrigo Braga

Robson Ramos

unread,
Dec 27, 2011, 8:02:15 PM12/27/11
to DotNet Brasil
Rodrigo,

Dá uma olhada no AuthorizeAttribute.
Ele consegue controlar acesso a Actions ou Controllers e, caso o
usuário não estiver logado, é possível configurá-lo para redirecionar
para a página de login.

Ficaria mais ou menos assim:

[Authorize(Roles = "Administradores,Gerentes")]
public class AdministracaoController : Controller
{
// ...
}

Att,

Robson Ramos

On 27 dez, 21:21, Rodrigo Braga <rbr...@gmail.com> wrote:
> Pessoal
>
> Uma ajuda, que imagino eu, seja até boba, mas como perguntar não ofende,
> sigamos!
>
> Estou olhando um projeto (CRUD, MVC e EF) onde querem expandi-lo para
> outras interfaces (inicialmente mobile, web app); e em várias partes do
> projeto, algumas regras estão no controller; temos o seguinte o cenário:
> uma classe *Empresa *possui uma coleção de *Alocações *e *Serviços*, uma

Rodrigo Braga

unread,
Dec 28, 2011, 7:23:01 AM12/28/11
to dotn...@googlegroups.com
Opa

Robson, apesar da aplicação usar o Membership Provider, decorar os métodos dessa forma não atende completamente, pois um mesmo usuário pode aparecer em mais de uma Empresa (Alocacao) e consequentemente ter diferentes possibilidades.

2011/12/27 Robson Ramos <robsonra...@gmail.com>
--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================



--
Att.,
Rodrigo Braga
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Rodrigo Braga

unread,
Dec 28, 2011, 8:47:58 AM12/28/11
to dotn...@googlegroups.com
Eu havia imaginado isso, mas mesmo assim acho que ficará "limitado" ao contexto web apenas.

Eu tenho minhas dúvidas se realmente vão querer portar isso pra outras interfaces, mas partindo do principio que de fato vão; em uma interface Mobile ou Console (por exemplo, claro) eu importaria a camada de domínio apenas e perderia isso, afinal a regra continuaria no controller.

De qualquer maneira, decorando dessa forma é bem melhor do que como está agora (festival de condicionais replicados e vários lugares).

2011/12/28 Robson Ramos <robsonra...@gmail.com>
Rodrigo,

Só agora percebi o que você quer fazer....

Você possui esses papéis cadastrados em algum lugar, certo?

Eu havia pensado em algo do tipo:

   public class InserirServicoAuthorizeAttribute :
AuthorizeAttribute
   {
       protected override bool AuthorizeCore(HttpContextBase
httpContext)
       {
           if (httpContext.User.Identity.IsAuthenticated)
           {
               // ... Busca do banco de dados a Role do usuário para
aquela empresa. Ex:
               //string funcaoDoUsuario = (from x in
context.FuncaoEmpresaUsuario
                                                     where
x.EmpresaId == xxx && Username == httpContext.User.Identity.Name
                                                     select
x.NomeDaFuncao).First();

               if (funcaoDoUsuario == "Administrador" ||
funcaoDoUsuario == "Vendedor")
               {
                   return true;
               }
           }

           return false;
       }

Assim, você poderia decorar a sua Action usando a classe acima:

       [InserirServicoAuthorize()]
       public ViewResult MinhaAction()

       {
           // ...
       }


Att,

Robson Ramos

On 28 dez, 10:23, Rodrigo Braga <rbr...@gmail.com> wrote:
> Opa
>
> Robson, apesar da aplicação usar o Membership Provider, decorar os métodos
> dessa forma não atende completamente, pois um mesmo usuário pode aparecer
> em mais de uma Empresa (Alocacao) e consequentemente ter diferentes
> possibilidades.
>
> 2011/12/27 Robson Ramos <robsonramosab...@gmail.com>



--
Att.,
Rodrigo Braga

Robson Ramos

unread,
Dec 28, 2011, 8:50:37 AM12/28/11
to DotNet Brasil
Rodrigo,

Só agora percebi o que você quer fazer....

Você possui esses papéis cadastrados em algum lugar, certo?

Eu havia pensado em algo do tipo:

public class InserirServicoAuthorizeAttribute  : AuthorizeAttribute{ 
  protected override bool AuthorizeCore(HttpContextBase httpContext) 
  {        if (httpContext.User.Identity.IsAuthenticated)        {   
         // Busca do banco de dados a Role do usuário para aquela
empresa. Ex:             string funcaoDoUsuario = (from x in
 context.FuncaoEmpresaUsuario                                        
where x.EmpresaId == xxx    && x.Username ==
httpContext.User.Identity.Name                                        
select x.NomeDaFuncao).First();              if (funcaoDoUsuario ==
"Administrador" || funcaoDoUsuario == "Vendedor")              {      
           return true;              }         }        return false; 
  }}

Assim, você poderia decorar a sua Action usando a classe acima:
        [InserirServicoAuthorize()]         public ViewResult
MinhaAction()         {             // ...         }
Att,
Robson Ramos
On 28 dez, 11:47, Rodrigo Braga <rbr...@gmail.com> wrote:
> Eu havia imaginado isso, mas mesmo assim acho que ficará "limitado" ao
> contexto web apenas.
>
> Eu tenho minhas dúvidas se realmente vão querer portar isso pra outras
> interfaces, mas partindo do principio que de fato vão; em uma interface
> Mobile ou Console (por exemplo, claro) eu importaria a camada de domínio
> apenas e perderia isso, afinal a regra continuaria no controller.
>
> De qualquer maneira, decorando dessa forma é bem melhor do que como está
> agora (festival de condicionais replicados e vários lugares).
>
> 2011/12/28 Robson Ramos <robsonramosab...@gmail.com>

Robson Ramos

unread,
Dec 28, 2011, 8:53:34 AM12/28/11
to DotNet Brasil
Opa Rodrigo,

Desculpa ae...
Estava tentando identar o código, mas, acabou bagunçando tudo...rs
Reply all
Reply to author
Forward
0 new messages