2011-05-04 28 views
8

Estoy empezando a utilizar Guice/Shiro en lugar de Spring/Spring Security. He buscado ejemplos del sitio de Shiro, y todos los ejemplos de configuración se hacen como ejemplos de archivos INI. ¿Es posible configurar Shiro en Java simple, ya que Guice Servlets está configurado para ser configurado?Configurando Apache Shiro con Google Guice Servlet

Respuesta

14

Sí, es posible, pero requiere un código de pegamento si desea que Guice cree sus Reinos.

  1. Enlazar aplicación Realm:
bind(Realm.class).to(MyRealm.class).in(Singleton.class); 
  1. Enlazar WebSecurityManager:
@Provides @Singleton WebSecurityManager securityManager(Realm realm) { 
     DefaultWebSecurityManager sm = new DefaultWebSecurityManager(); 
     sm.setRealm(realm); 
     return sm; 
    } 
  1. Subclase uno de los filtros de Shiro esta manera puede utilizar Guice proporciona WebSecurityManager:
public class SecurityFilter extends IniShiroFilter { 

     static class SecurityManagerFactory extends WebIniSecurityManagerFactory { 

     private final WebSecurityManager securityManager; 

     public SecurityManagerFactory(WebSecurityManager securityManager) { 
      this.securityManager = securityManager; 
     } 

     public SecurityManagerFactory(WebSecurityManager securityManager, Ini ini) { 
      super(ini); 
      this.securityManager = securityManager; 
     } 

     @Override 
     protected SecurityManager createDefaultInstance() { 
      return securityManager; 
     } 
     } 

     private final Provider<WebSecurityManager> securityManager; 

     @Inject 
     SecurityFilter(Provider<WebSecurityManager> securityManager) { 
     super(); 
     this.securityManager = securityManager; 
     } 


     protected Map<String, ?> applySecurityManager(Ini ini) { 
     SecurityManagerFactory factory; 
     if (ini == null || ini.isEmpty()) { 
      factory = new SecurityManagerFactory(securityManager.get()); 
     } else { 
      factory = new SecurityManagerFactory(securityManager.get(), ini); 
     } 
     setSecurityManager((WebSecurityManager) factory.getInstance()); 
     return factory.getBeans(); 
     } 
    } 
  1. Configurar el filtro:
Joiner lines = Joiner.on("\n"); 
    Map<String, String> config = ImmutableMap.of("config", lines.join(
     "; here you can provide additional ini", 
     "[roles]", 
     "admin = *", 
     "[urls]", 
     "/secure/** = authcBasic" 
    )); 
    filter("/*").through(SecurityFilter.class, config); 
+0

Gracias por respuesta con código completo! Entonces eventualmente la configuración debe estar en formato ini de todos modos? – newbie

+0

Ini es opcional, puede configurar WebSecuirtyManager en el método del proveedor de forma manual. – sanjary