User permissions

2

I do not know how I can be implementing user permissions on my systems and would like to get some north.

From my class:

public class Loja_Usuarios
{
    public int ID { get; set; }
    public string Nome { get; set; }
    public string Login { get; set; }
    public string Senha { get; set; }
    public bool Pedido { get; set; }
    public bool Produto { get; set; }
    public bool Cliente { get; set; }
    public bool Carrossel { get; set; }
    public bool Carta { get; set; }
    public bool Usuario { get; set; }
    public bool Codigo { get; set; }
    public bool Ativo { get; set; }
    public bool Menu { get; set; }
}

public class Loja_Carrossel
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Nome deve ser preenchido")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "Imagem deve ser preenchido")]
    public string Imagem { get; set; }

    [Required(ErrorMessage = "URL deve ser preenchido")]
    public string URL { get; set; }
}

Where Request, Product, Client ..., are all the permissions of the user. But from here I do not know how to do that. I do not know if it uses ASP.Net Identity or another. When I did this on other systems, I just validated whether I was logged in or not.

    
asked by anonymous 20.06.2014 / 19:49

1 answer

4

I'm guessing the following in your Models :

Models / Loja.cs

public class Loja 
{
    [Key]
    public int LojaId { get; set; }

    [Required]
    public String Nome { get; set; }
    ...

    public virtual ICollection<Loja_Usuario> Usuarios { get; set; }
}

Models / Loja_Usuario.cs

public class Loja_Usuarios
{
    public int ID { get; set; }
    public int LojaId { get; set; }

    public string Nome { get; set; }
    public string Login { get; set; }
    public string Senha { get; set; }
    public bool Pedido { get; set; }
    public bool Produto { get; set; }
    public bool Cliente { get; set; }
    public bool Carrossel { get; set; }
    public bool Carta { get; set; }
    public bool Usuario { get; set; }
    public bool Codigo { get; set; }
    public bool Ativo { get; set; }
    public bool Menu { get; set; }

    public virtual Loja Loja { get; set; }
}

Also declare the following Enum :

Enums / Permissao.cs

public enum Permissao 
{
    Pedido,
    Produto,
    Cliente,
    Carrossel,
    Carta,
    Usuario,
    Codigo,
    Ativo,
    Menu
}

Implement your own authorization attribute:

Attributes / CustomAuthorizationAttibute.cs

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    private Permissao[] _permissoes;
    private MeuProjetoContext context = new MeuProjetoContext();

    public CustomAuthorizeAttribute(params Permissao[] permissoes) 
    {
        _permissoes = permissoes;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {
            return false;
        }

        if (!_permissoes.Any()) return true;

        var usuarioId = LoggedUserHelper.UsuarioId(httpContext.User);
        var usuario = context.Loja_Usuarios.SingleOrDefault(u => u.ID == usuarioId);

        foreach (permissao in _permissoes) 
        {
            switch (permissao) 
            {
                case Permissao.Pedido:
                    return usuario.Pedido;
                case Permissao.Produto:
                    return usuario.Produto;
                case Permissao.Cliente:
                    return usuario.Cliente;
                case Permissao.Carrossel:
                    return usuario.Carrossel;
                case Permissao.Carta:
                    return usuario.Carta;
                case Permissao.Usuario:
                    return usuario.Usuario;
                case Permissao.Codigo:
                    return usuario.Codigo;
                case Permissao.Ativo:
                    return usuario.Ativo;
                case Permissao.Menu:
                    return usuario.Menu;
            }
        }

        return false;
    }

    // Implemente abaixo pra onde a requisição vai se o usuário não estiver autorizado
    /* protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary(
                new
                {
                    controller = "Error",
                    action = "Unauthorised"
                })
            );
    } */
}

Use in your Controller :

// Para poder ter acesso a esta action, o usuário precisa ter permissão ou de 
// Cliente, ou de Usuario.
[CustomAuthorize(Permissao.Cliente, Permissao.Usuario)]
public ActionResult Index() 
{
   ...
}

It is possible to use only to verify that the user is authenticated.

[CustomAuthorize]
public ActionResult Index() 
{
   ...
}
    
20.06.2014 / 22:01