使用Shiro Guice和jdbcRealm

时间:2014-11-05 14:48:35

标签: java jdbc guice shiro

我是Guice和Shiro的新手,我正在尝试将它用于我的数据库(h2)。 我读过这个:click

但正如他们所说,它只是为用户和角色部分工作,这对我来说毫无用处。

我的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");
}
}

和我的模块:

public class Module extends AbstractModule {

@Singleton

protected void configure() {
    Injector injector = Guice.createInjector(new MyShiroModule());
    SecurityManager securityManager = injector.getInstance(SecurityManager.class);
    SecurityUtils.setSecurityManager(securityManager);        
}
}
他们正如他们在教程中所说的那样。 我需要添加什么才能使用shiro.ini的[main]部分?

1 个答案:

答案 0 :(得分: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);
    }
  }

}