2014-11-05 31 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); 
    } 
    } 

} 
相關問題