2014-11-05 57 views
2

我是Guice和Shiro的新手,我试图将它与我的DB(h2)一起使用。 我读过这个:click与jdbcRealm一起使用Shiro Guice

但他们说,它只是为用户和角色部分工作,这对我来说没用。

我的shiro.ini工作,我设法创建用户,登录和注销没有Guice部分。

我MyShiroModule

public class MyShiroModule extends ShiroModule{ 

protected void configureShiro() { 
    try { 
     bindRealm().toConstructor(IniRealm.class.getConstructor(Ini.class)); 
    } catch (NoSuchMethodException e) { 
     addError(e); 
    } 
} 

@Provides 
Ini loadShiroIni() { 
    return Ini.fromResourcePath("classpath:shiro.ini"); 
} 
} 

和我的模块:

公共类模块,因为他们在本教程中所说延伸AbstractModule {

@Singleton 

protected void configure() { 
    Injector injector = Guice.createInjector(new MyShiroModule()); 
    SecurityManager securityManager = injector.getInstance(SecurityManager.class); 
    SecurityUtils.setSecurityManager(securityManager);   
} 
} 

他们。 我需要添加什么来使用我的shiro.ini的[main]部分?

回答

1

我从来没有得到JDBC领域与Guice一起工作,因为,正如你所说,它只是读取用户和组部分出于任何原因。我最终没有使用Shiro.ini,只是创建了JdbcRealm我自己是这样的:

public class ShiroAuthModule extends ShiroModule { 

    @Override 
    public void configure() { 
    super.configure(); 
    // Bind your data source however you need to - I use JNDI 
    // but it would be easy to switch to a properties file. 
    bind(Context.class).to(InitialContext.class); 
    bind(DataSource.class).toProvider(JndiIntegration.fromJndi(DataSource.class, "java:/comp/env/jdbc/security")); 
    } 

    @Provides 
    @Singleton 
    JdbcRealm loadJdbcRealm(Ini ini, DataSource ds, 
     @Named("shiro.authenticationQuery") String authenticationQuery, 
     @Named("shiro.userRolesQuery") String roleQuery, 
     @Named("shiro.permissionsQuery") String permissionQuery) { 
    JdbcRealm realm = new JdbcRealm(); 
    realm.setAuthenticationQuery(authenticationQuery); 
    realm.setUserRolesQuery(roleQuery); 
    realm.setPermissionsQuery(permissionQuery); 
    realm.setPermissionsLookupEnabled(true); 
    realm.setDataSource(ds); 
    return realm; 
    } 

    @Override 
    protected void configureShiro() { 
    // shiro.properties should be on your classpath and 
    // contain the named properties in loadJdbcRealm 
    Properties properties = Module.loadProperties(this, "shiro.properties"); 
    Names.bindProperties(binder(), properties); 
    try { 
     bindRealm().to(JdbcRealm.class); 
    } catch (SecurityException e) { 
     addError(e); 
    } 
    } 

}