Selección de elemento de selección de evento HTML JS.

Hogar Digamos que tienes .net API web

con la acción GetResource(int ResourceId). Esta acción (con el ID especificado) solo debe permitirse para el usuario asociado con ese ID (por ejemplo, el recurso podría ser un blogger escrito por el usuario). esto se puede solucionar de diferentes maneras

, pero a continuación se muestra un ejemplo.

Recurso público GetResource(int id) (nombre de cadena = Thread.CurrentPrincipal.Identity.Name; var usuario = userRepository.SingleOrDefault(x => x.UserName == nombre); var recurso = recursoRepository.Find(id); if (recurso .UserId! = usuario.UserId) (lanzar nueva HttpResponseException (HttpStatusCode.Unauthorized);) devolver recurso;

donde el usuario fue autenticado por algún mecánico.

Ahora digamos que también quiero que un usuario como administrador tenga derecho a consumir el punto final (con el mismo ID). Este usuario no tiene una relación directa con el recurso, pero tiene autorización por su tipo (o rol). Esto se puede resolver simplemente verificando si el usuario es del tipo Administrador y devolviendo el recurso.

¿Hay alguna manera de centralizar esto para no tener que escribir un código de autorización en cada acción?

Editar Según las respuestas, creo que debería aclarar mi pregunta. Lo que realmente estoy haciendo es un mecanismo que le permite tener autorización basada en recursos, pero al mismo tiempo permite que algunos usuarios también usen el mismo punto final y el mismo recurso. La siguiente acción resolverá esto para este punto final específico y para este rol específico

(Administración).

Recurso público GetResource(int id) (nombre de cadena = Thread.CurrentPrincipal.Identity.Name; var usuario = userRepository.SingleOrDefault(x => x.UserName == nombre); var recurso = recursoRepository.Find(id); if (! user.Roles.Any(x => x.RoleName == "Admin" || recurso.UserId != usuario.UserId) ( throw new HttpResponseException(HttpStatusCode.Unauthorized); ) devolver recurso; lo que obtengo es método general

resuelva este problema para no tener que escribir dos puntos finales diferentes con el mismo propósito o escribir código específico de recurso en cada punto final.

Para la autorización basada en recursos, sugeriría usar una identificación basada en reclamos e insertar la identificación del usuario como reclamo. Escriba un método de extensión para leer un reclamo de un individuo. Entonces el código de muestra se vería así:

Recurso público GetResource(int id) ( var recurso = recursoRepository.Find(id); if (resource.UserId != User.Identity.GetUserId()) ( throw new HttpResponseException(HttpStatusCode.Unauthorized); ) devolver recurso; )

Si desea simplificar aún más el código, puede escribir un UserRepository que conozca los datos del usuario y el repositorio de recursos para centralizar el código. El código se verá así:

Recurso público GetResource(int id) ( return User.Identity.GetUserRepository().FindResource(id); )

Para la autorización basada en roles, AuthorizeAttribute será mejor lugar para manejarlo, y es mejor que uses una acción o controlador separado para eso.

Recurso público GetResourceByAdmin(int id) ( return recursoRepository.Find(id); )

[Editar] Si OP quiere usar una acción para trabajar diferentes tipos usuarios, personalmente prefiero usar una fábrica de repositorios de usuarios. Código de acción:

Recurso público GetResource(int id) ( return User.GetUserRepository().FindResource(id); )

El método de extensión será:

IUserRepository estático público GetUserRepository (este IPrincipal principal) ( var ResourceRepository = new ResourceRepository(); bool isAdmin = principal.IsInRole("Admin"); if (isAdmin) ( devuelve nuevo AdminRespository(resourceRepository); ) else ( devuelve nuevo UserRepository(principal .Identidad, repositorio de recursos);

La razón por la que no quiero usar AuthorizeAttribute para verificar la autenticidad de cada recurso es porque diferentes recursos pueden tener códigos diferentes para verificar la propiedad, es difícil centralizar el código en un atributo y requiere operaciones de base de datos adicionales, lo cual no es así. realmente necesario. Otro problema es que AuthroizeAttribute ocurre antes de que se vinculen los parámetros, por lo que debe asegurarse de que el parámetro de acción provenga de los datos de la ruta. De lo contrario, por ejemplo, no podrá obtener el valor del parámetro del cuerpo del mensaje.

Necesita externalizar su autorización. Quiere mover toda la lógica de autorización a una capa o servicio independiente.

Hay varios marcos - en diferentes idiomas- que te permiten hacer esto. En el mundo .NET, como se sugiere en otras respuestas, tiene autorización basada en requisitos. Microsoft tiene un excelente artículo sobre .

  • Arquitectura estándar con el concepto de un punto de decisión de política (PDP es su servicio de autorización) que puede servir como decisiones de sí/no.
  • un lenguaje estándar para expresar la lógica de autorización utilizando cualquier número de parámetros/atributos, incluidos atributos de usuario e información de recursos.
  • un esquema de solicitud/respuesta para enviar sus preguntas de autorización al PDP.

Si vamos a tu ejemplo, tendrás algo línea por línea:

Recurso público GetResource(int id) ( var recurso = recursoRepository.Find(id); if (isAuthorized(User.Identity,resource)) ( throw new HttpResponseException(HttpStatusCode.Unauthorized); ) devolver recurso; ) public bool isAuthorized(Usuario u , Recurso r)( // Crear solicitud XACML aquí // Llamar a PDP // devolver decisión booleana)

Su PDP contendrá las siguientes reglas:

  • un usuario puede realizar una acción == ver un recurso si y sólo si recurso.propietario == usuario.id
  • un usuario con el rol de administrador == puede realizar una acción == en el recurso.

La ventaja de XACML es que puede diseñar sus propias reglas/lógica de autorización independientemente de su código. Esto significa que no tiene que tocar el código de su aplicación cada vez que cambia la lógica. XACML también puede ofrecer más parámetros/atributos, por ejemplo, ID del dispositivo, dirección IP, hora del día... Finalmente, XACML no es específico de .NET. Funciona para diferentes marcos.

Consideraría implementar un System.Web.Http.AuthorizeAttribute personalizado que podría aplicar a acciones que necesitan esa regla de autorización específica. En la autorización de usuario, puede permitir el acceso si el usuario es miembro del grupo Administradores o si es el autor del recurso.

CAMBIAR:

Según la edición del OP, permítanme ampliar lo que estoy diciendo. Si anula AuthorizeAttribute, puede agregar lógica como:

Clase pública AuthorizeAdminsAndAuthors: System.Web.Http.AuthorizeAttribute ( anulación protegida bool IsAuthorized(HttpActionContext actionContext) ( return currentUser.IsInRole("Admins") || IsCurrentUserAuthorOfPost(actionContext); ) bool privado IsCurrentUserAuthorOfPost(HttpActionContext contexto de acción) ( // Obtener ID del recurso de actionContext // buscar si el usuario es el autor de esta publicación y devolver verdadero)

Este es un pseudocódigo, pero debería transmitir la idea. Si tiene un único AuthorizeAttribute que define la autorización según sus requisitos: la solicitud actual proviene del autor de la publicación o de un administrador, entonces puede aplicar el atributo AuthorizeAdminsAndAuthors a cualquier recurso donde se requiera ese nivel de autorización. Entonces su recurso se verá así:

Recurso público GetResource(int id) ( var recurso = recursoRepository.Find(id); devolver recurso; )

Establece un controlador de selección de texto dentro del elemento o activa este evento. este evento sólo puede ocurrir en elementos y. El método tiene tres casos de uso:

controlador(eventObject): una función que se establecerá como controlador. Cuando se llame, recibirá un objeto de evento. objeto de evento .

controlador (eventObject) - ver arriba.
eventData: datos adicionales pasados ​​al controlador. Deben estar representados por un objeto en el formato: (fName1:value1, fName2:value2, ...) .

Puede eliminar un controlador instalado utilizando el método unbind().

Las tres opciones para usar el método son análogas a otros métodos (ver arriba), por lo que todos los detalles usando seleccionar() se puede encontrar en las descripciones de estos métodos.

Al seleccionar texto con el mouse, los navegadores activan un evento de selección cuando se completa la selección. Si la selección se produce presionando las teclas ← → ↓ mientras se mantiene presionada la tecla Mayús, el evento ocurrirá cada vez que se suelte la tecla de flecha.

Para obtener la parte seleccionada del texto en diferentes navegadores requerido diferentes medios. En Firefox y Google Chrome la parte seleccionada será proporcionada por el método window.getSelection() o document.getSelection(), mientras que IE y Opera proporcionarán el texto deseado al llamar al método document.selection.createRange(). La versión para varios navegadores se verá así:

función Texto seleccionado() ( if (window.getSelection) txt = window.getSelection().toString(); else if (document.getSelection) txt = document.getSelection(); else if (document.selection) txt = document.selection .createRange().texto;devolver texto)

Tenga en cuenta que la función selectedText() no solo funcionará para y , sino que devolverá el texto seleccionado sin importar en qué elemento se encuentre.

Ejemplo

//instalar el controlador seleccionar eventos, elemento con identificador foo $("#foo" ).select (function () (alerta ("Dentro del elemento foo, el texto ha sido seleccionado por el usuario." ); ) );

// llamar al evento de selección en el elemento foo $("#foo" ) .select () ;

// instalar otro controlador de eventos de selección, esta vez para elementos // con la clase de bloque. Pasemos datos adicionales al controlador $(".block" ) .select (( a: 12 , b: "abc" ) , function (eventObject) ( var externalData = "a=" + eventObject.data .a + ", b= " + eventObject.data .b ; alert ("Se seleccionó texto dentro de un elemento con la clase de bloque" + "Se pasaron datos al controlador de este evento: " + externalData ); ) ); la lista puede ser con la capacidad de seleccionar solo una opción o varias opciones. Cada contenedor está asociado con un objeto de la clase Select y cada contenedor secundario está asociado con un objeto de la clase Option, que es una propiedad.

de este objeto clase Seleccionar. Además, una propiedad de un objeto Select también es una colección de opciones que incluye todos sus objetos Option secundarios. Enumeremos las principales propiedades, métodos y eventos que caracterizan a estos objetos.

Seleccionar objeto

Propiedades Métodos Controladores de eventos

opciones tamaño longitud múltiple índice seleccionado

enfocar() difuminar() agregar() eliminar() onBlur onChange onFocus

Objeto de opción

Propiedades Métodos Eventos Propiedades Métodos Eventos

defaultSelected valor de texto de índice seleccionado No No describiremos todas las propiedades, métodos y eventos de estos dos objetos. Detengámonos en

formas típicas

utilizando sus combinaciones. Crear objetos de opción El objeto de clase Option es interesante porque, a diferencia de muchos otros integrados en el DOM

Objetos JavaScript

, tiene un constructor. Esto significa que el programador puede crear él mismo un objeto de clase Opción:

  • opt = nueva opción ([texto, [valor, [seleccionado por defecto, [seleccionado]]]]);
  • valor: el valor que se pasa al servidor al seleccionar una alternativa asociada con un objeto de opción;
  • defaultSelected: si esta alternativa está seleccionada de forma predeterminada (verdadero/falso);
  • seleccionado: la alternativa fue seleccionada por el usuario (verdadero/falso).

A primera vista, no está muy claro por qué un programador podría necesitar un objeto de este tipo, ya que es imposible crear un objeto de la clase Select y, por lo tanto, es imposible asignarle un nuevo objeto de Opción. Todo está explicado a la hora de cambiar la lista de alternativas para un objeto Select en el documento. Esto se puede hacer y cambiar la lista de Seleccionar alternativas no conduce a reformatear el documento. Cambiar la lista de alternativas permite solucionar el problema de crear menús anidados que no existen en formularios HTML mediante programación menú regular(opciones).

Al programar alternativas, se debe prestar atención al hecho de que los objetos de la clase Opción no tienen la propiedad de nombre, debido a que el contenedor no tiene atributo NOMBRE. Por lo tanto, solo se puede acceder a los objetos de opción incrustados en un documento como miembros de la colección de opciones.

Opciones de colección

Las opciones integradas de matriz (colección) son una de las propiedades del objeto Seleccionar. Los elementos de esta matriz son objetos completos de la clase Opción. Se crean cuando el navegador carga la página. El número de objetos Option contenidos en el objeto document.f.s de la clase Select se puede encontrar usando propiedad estándar matriz: document.fsoptions. longitud. Además, el objeto Select en sí tiene la misma propiedad: document.f.s. longitud: es completamente idéntico al anterior.

El programador tiene la oportunidad no sólo de crear nuevos objetos de Opción, sino también de eliminar objetos ya creados por el navegador:

Primera opción Segunda opción Tercera opción 5.3.

Eliminando opciones de SELECT EN en este ejemplo A la hora de cargar una página desde el servidor, tenemos tres alternativas. Estos se pueden ver como una lista desplegable de opciones. Después de hacer clic en el botón "Eliminar"última opción

"Sólo quedan dos alternativas en el formulario. Si vuelve a hacer clic en este botón, sólo quedará una alternativa. Al final, no quedará ninguna opción, es decir, el usuario perderá la oportunidad de elegir. Cuando se pulsa el botón de reinicio Al hacer clic, las opciones no se restauran: las alternativas se pierden sin dejar rastro.

función RestoreOptions() ( document.f.s.options = nueva Opción("Opción uno","",true,true); document.f.s.options = nueva Opción("Opción dos"); document.f.s.options = nueva Opción("Opción tres"); return false; ) Primera opción Segunda opción Tercera opción 5.4.

Eliminar y agregar opciones de SELECT Colocamos la restauración de alternativas en el controlador de eventos onReset del contenedor FORM. Objetos creados de la clase Option asignamos al objeto document.f.s de la clase Select. En este caso, la primera alternativa debe seleccionarse de forma predeterminada (el argumento defaultSelected se establece en verdadero) para simular el comportamiento cuando oreja

páginas.

Las propiedades de texto y valor del objeto Opción.

La propiedad de texto representa el texto que se muestra en el menú que corresponde a la alternativa. En el código HTML se encuentra entre las etiquetas y. La propiedad de valor contiene el valor del atributo VALOR de la etiqueta. Por ejemplo, digamos que una de las opciones de la lista se describe como:

Opción uno Entonces el valor propiedades del texto

el objeto correspondiente tendrá "Opción uno" y la propiedad de valor tendrá "n1". Surge la pregunta, ¿por qué se necesitan dos propiedades? El hecho es que el valor de la opción seleccionada se transfiere al servidor. En el caso de que el contenedor no tenga un atributo VALOR, el valor de texto se envía al servidor.selectedIndex devolverá el índice de la primera opción seleccionada. En este caso, existe una alternativa: la propiedad seleccionada en cada objeto Opción. es cierto si esta opción

está seleccionado, y false en caso contrario. A continuación se dará un ejemplo. Controlador de eventos objeto onChange

Seleccionar

El evento Cambiar ocurre cuando el usuario cambia su elección de opciones. Si el campo es un campo de selección de opción única, entonces todo es simple; vea el ejemplo anterior. Veamos qué sucede cuando tratamos con un campo de opción múltiple:
Frutas: manzana plátano kiwi melocotón

Puestos seleccionados: 5.5.

Controlador onChange para selecciones múltiples

Las propiedades de texto y valor del objeto Opción.

La propiedad de texto representa el texto que se muestra en el menú que corresponde a la alternativa. En el código HTML se encuentra entre las etiquetas y. La propiedad de valor contiene el valor del atributo VALOR de la etiqueta. Por ejemplo, digamos que una de las opciones de la lista se describe como:

Opción uno

Entonces el valor de la propiedad de texto del objeto correspondiente será igual a "Opción uno", y el valor de la propiedad de valor será igual a "n1".

Surge la pregunta, ¿por qué se necesitan dos propiedades? El hecho es que el valor de la opción seleccionada se transfiere al servidor. Si el contenedor no tiene el atributo VALOR, el valor del texto se envía al servidor.

La propiedad selectedIndex del objeto Select devuelve el número de la opción seleccionada (la numeración comienza desde cero).

Opción: OneTwoChoose índice:

Observe que en el controlador de eventos onChange estamos haciendo referencia al segundo elemento del formulario. En en este momento no está definido, pero el evento solo ocurrirá cuando seleccionemos una opción; en ese momento el campo ya estará definido.

Si la lista de opciones se proporciona como , es decir con la capacidad de seleccionar varias opciones a la vez, la propiedad selectedIndex devolverá el índice de la primera opción seleccionada. En este caso, existe una alternativa: la propiedad seleccionada de cada objeto Opción. Es verdadero si se selecciona esta opción, falso en caso contrario. A continuación se dará un ejemplo.

El evento Cambiar ocurre cuando el usuario cambia su elección de opciones. Si el campo es un campo de selección de opción única, entonces todo es simple; vea el ejemplo anterior. Veamos qué sucede cuando tratamos con un campo de opción múltiple:

Frutas: latas de manzana, vipeach.
Artículos seleccionados:

Ejemplo 5.5. Controlador onChange al seleccionar múltiples opciones (html, txt)

Tenga en cuenta que el evento Cambiar ocurre cuando el usuario selecciona o anula la selección de una opción. La excepción es cuando las opciones se marcan secuencialmente durante la selección (presionando el botón del mouse en un elemento, moviendo el mouse al elemento final, soltando el botón del mouse). En este caso, el evento ocurre cuando el usuario suelta el botón del mouse y todas las alternativas marcadas quedan seleccionadas.




Arriba