2010-02-21 20 views

Respuesta

0

tiene que configurar el archivo de configuración/SecurityConfig.groovy (si no existe, lo crea, esto anula la configuración de seguridad por defecto)

Añadir esta entrada:

requestMapString = """\ 
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
      PATTERN_TYPE_APACHE_ANT 
      /=IS_AUTHENTICATED_REMEMBERED 
      /login/auth=IS_AUTHENTICATED_ANONYMOUSLY 
      /login/authajax=IS_AUTHENTICATED_ANONYMOUSLY 
      /login/authfail=IS_AUTHENTICATED_ANONYMOUSLY 
      /js/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /css/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /images/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /plugins/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /**=IS_AUTHENTICATED_REMEMBERED 
      """ 

Este es un medio que debe iniciar sesión para ingresar al sitio. Pero se accede a todos los recursos (css, js, imágenes, etc.) sin autentificación.

Si quieres función específica sólo entran controlador específico: Por ejemplo, para UserController:

/user/**=ROLE_ADMIN 
    /role/**=ROLE_ADMIN 

Para más información: http://www.grails.org/AcegiSecurity+Plugin+-+Securing+URLs

Saludos

+0

Lo siento si mi pregunta era malentendido, ya he asegurado mis controladores con un RequestMap (no en SecurityConfig.groovy, pero usando una tabla de base de datos) y todo esto funciona perfecto. Mi pregunta era, ¿cómo puedo comprobar si el usuario actual tiene acceso a un determinado controlador y acción. Estoy pensando en esto así: if (currentUserHasAccess (controller, action)) {do_some_stuff} – Jan

1

Cuando se trata de permisos de puntos de vista y taglibs , puede usar el AuthorizeTagLib proporcionado por el complemento.

Por ejemplo, si no desea que un elemento de menú que aparecerá en su lista de usuarios no autenticados, es posible utilizar:

<g:isLoggedIn> 
    <li>Restricted Link</li> 
</g:isLoggedIn> 

Si tiene funciones más específicas definidas y esas funciones están vinculados a su solicitud de asignación de controlador/acción, puede utilizar otras etiquetas, tales como:

<g:ifAllGranted role="ROLE_ADMINISTRATOR"> 
    <li>Administrator Link</li> 
</g:ifAllGranted> 

En mi experiencia, todavía no es una buena manera de atar el mapeo solicitud a su margen de beneficio - Creo que vas a tener que utilice algunas de las etiquetas anteriores para limitar el acceso al contenido dentro de un GSP en particular.

Creo que Burt Beckwith tiene una modificación en el futuro (y actualmente proporciona un beta version) al complemento que integra algunas cosas de ACL que podrían resolver mejor este problema en el futuro, pero por ahora, creo que el mejor enfoque es mapa de solicitud híbrida + etiquetas GSP uno.

+0

He visto ese TagLib, pero realmente no resuelve mi problema. Tal vez podría utilizar los métodos ifAllGranted o ifAnyGranted, si hay una manera de coincidir con un controlador y la acción a una entrada en mi requestMap ... ¿Alguien sabe cómo se hace esto? – Jan

0

Por lo que yo sé, no parece que haya una manera fácil de hacerlo.

Usted puede inyectar una instancia de la griales AuthenticatedVetoableDecisionManager que es una clase concreta de AbstractAccessDecisionManager de la primavera al hacer esto:

def accessDecisionManager 

Esto tiene un método "decidir" en él que toma 3 parámetros

decide(Authentication authentication, Object object, ConfigAttributeDefinition config) 

Este es probablemente el método que necesitarías para llamar y pasar las cosas correctas para averiguar si el usuario con las credenciales de autenticación puede acceder a ese "objeto" (que parece que normalmente es una solicitud/respuesta). Algunas excavaciones adicionales podrían ser útiles aquí.

A corto plazo, probablemente sea más fácil usar el taglib ifAnyGranted como otro cartel menciona.

+0

Gracias, hombre, buscaré una solución en esta dirección. De todos modos, me gustaría utilizar el taglib ifAnyGranted, pero aún tengo que averiguar qué roles se aplican en el caso actual, es decir, encontrar una manera de obtener los roles para un controlador/acción específica de mi RequestMap. – Jan

0

no estoy seguro acerca de maravilloso, pero en Java (por lo que asumen maravilloso también ...) que podría hacer (cheques, menos NPE):

GrantedAuthority[] authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
boolean isAdmin = false; 
for(GrantedAuthority authority : authorities) { 
    String role = authority.getAuthority(); 
    if(role != null && role.equals("ROLE_ADMIN")) { 
     isAdmin = true; 
     break; 
    } 
} 

En cuanto a saber si la acción o no es compatible, debe llamar al servicio RequestMap para obtener las funciones de la asignación y ver si contiene la función de usuario encontrado.

+0

Gracias por su código, pero creo que esto es lo que hace ifAnyGranted ... La parte interesante es este "Servicio RequestMap" - ¿tiene más información al respecto? No pude encontrar nada con google ... – Jan

4
 
org.grails.plugins.springsecurity.service.AuthenticateService authenticateService = new org.grails.plugins.springsecurity.service.AuthenticateService() 
def isAdmin = authenticateService.ifAllGranted('ROLE_ADMIN') 

if(isAdmin) { 
    println 'I am Admin' 
} 
3

Esta pregunta es bastante antigua, pero pensé que publicaría al menos una respuesta que parece funcionar con Grails 2.0. Si está utilizando el complemento de seguridad Spring, hay una etiqueta lib incluida llamada grails.plugins.springsecurity.SecurityTagLib.

La etiqueta-lib tiene un método protegido, hasAccess() que puede tomar el mismo mapa de params que le da a la etiqueta g:. Entonces, si extiende SecurityTagLib, puede llamar a hasAccess() y obtener el comportamiento que desea. Por qué esto no se externaliza en un servicio que se puede inyectar está más allá de mí ya que la funcionalidad parece satisfacer una necesidad obvia.

Lo utilizamos para envolver el g: etiqueta de enlace y sólo generará un enlace del usuario tiene acceso a la página de destino:

def link = { attrs, body -> 
    if(hasAccess(attrs.clone(), "link")) { 
     out << g.link(attrs, body) 
    } 
    else { 
     out << body() 
    } 
} 
+1

Envoltura g: el enlace también es lo que hicimos. BTW Groovy no tiene en cuenta 'protected' e incluso' private', por lo que solo puede insertar una instancia de 'SecurityTagLib' e invocarlo. –

+0

No estoy seguro de la situación cuando esto fue respondido, pero esta funcionalidad ahora está expuesta a través de 'SpringSecurityUtils'. –

+1

@mattforsythe ¿dónde exactamente está expuesto? Ni los [documentos] (https://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html#springSecurityUtils) ni el [código fuente] (https://github.com/grails -plugins/grails-spring-security-core/blob/master/src/java/grails/plugin/springsecurity/SpringSecurityUtils.java) menciona cualquier método que pueda aceptar un mapa con 'controller' y' action' (or 'url') argumentos y devuelve un booleano, que es lo que 'hasAccess()' hace. – Tobia

6

Para comprobar los papeles a la vista: complemento de seguridad de un resorte que proporciona ifAllGranted , ifAnyGranted, ifNoneGranted etc., etiquetas para comprobar papeles

Por ejemplo, para comprobar rol de administración de usuario conectado:

<sec:ifLoggedIn> 
    <sec:ifAllGranted roles="ROLE_ADMIN"> 
     Admin resource 
    </sec:ifAllGranted> 
</sec:ifLoggedIn> 

(probado en griales-2.2.2 y springSecurityCorePlugin-1.2.7.3)

+2

... y luego está '', también – HumanInDisguise

1

No está seguro de la situación cuando fue publicada originalmente esta pregunta, pero ahora se puede comprobar para ver si un usuario está en un papel específico mediante el uso de SpringSecurityUtils.ifAllGranted() que toma una sola Cadena que es una lista de roles delimitada por comas. Volverá verdadero si el usuario actual pertenece a todos ellos.

if(SpringSecurityUtils.ifAllGranted('ROLE_ADMIN,ROLE_USER')) { 

Obviamente, puede simplemente pasar un rol a la función si eso es todo lo que necesita. SpringSecurityUtils también tiene métodos como ifAnyGranted, ifNotGranted, etc., por lo que debería funcionar para lo que sea que esté tratando de lograr.

SpringSecurityUtils es una API estática, por lo que no necesita crear un miembro privado llamado springSecurityUtils ni nada de eso.

Cuestiones relacionadas