2012-01-19 15 views
6

Encontré realmente un marco de seguridad flexible Apache Shiro. Implementé con éxito la autenticación y autorización usando Shiro.Control de acceso de nivel de instancia en Apache Shiro

Una de las características atractivas del marco es la seguridad basada en instancias. Acabo de copiar el ejemplo del sitio web de Shiro.

Los siguientes permisos se almacenan en la base de datos.

printer:query:lp7200 
printer:print:epsoncolor 

La siguiente comprobación de código si para una instancia determinada impresora, el usuario autenticado actual tiene permiso o no.

if (SecurityUtils.getSubject().isPermitted("printer:query:lp7200") { 
// Return the current jobs on printer lp7200 
} 

Mi pregunta es que "¿Es así como se almacenan los permisos en la base de datos?" ¿Existe alguna forma mejor de almacenar permisos basados ​​en instancias?

Háganme saber.

Gracias

Respuesta

9

Cómo almacena esta información es decisión suya. Su implementación Realm es responsable de consultar el origen de datos que está utilizando y extraer los datos de permisos en el formato que prefiera.

Algunas personas las almacenan como cadenas directamente (como las que se muestran en su ejemplo), otras las almacenan en una tabla dedicada (por ejemplo, si usa un RDBMS) (por ejemplo, permission_type, target, action columns). Puede asociar las entidades de permiso a roles o directamente a usuarios o grupos asignados a usuarios, etc., sin embargo, tiene sentido para su aplicación.

Sus opciones de almacenamiento son totalmente de usted. Usted materializa los datos, sin embargo, desea asegurarse de que las operaciones Realm.isPermitted(...) funcionen como se espera.

En lugar de implementar los métodos Realm.isPermitted(...) directamente, muchas personas les resulta más conveniente a subclase la clase abstracta AuthorizingRealm y reemplazar el método doGetAuthorizationInfo y volver AuthorizationInfo instancias que apoyan las representaciones de permisos.

En ese método, puede consultar su almacén de datos, traducir los datos devueltos en AuthorizationInfo instancias, y habrá terminado (no olvide habilitar el almacenamiento en memoria caché de autorización; verá un gran beneficio de rendimiento).

Anulación de las RealmisPermitted métodos sólo es necesario si desea tener un control muy específico sobre las consultas, etc.

Cuestiones relacionadas