使用Google Guice Servlet配置Apache Shiro

8

我开始使用Guice/Shiro代替Spring/Spring Security。我查看了Shiro网站上的示例,所有的配置示例都是以INI文件示例的形式呈现的。是否可以像Guice Servlets一样在纯Java中配置Shiro?

1个回答

14

是的,这是可能的,但如果你想让Guice创建你的Realms,需要一些粘合代码。

  1. 绑定Realm实现:
    bind(Realm.class).to(MyRealm.class).in(Singleton.class);
  1. 绑定WebSecurityManager:
    @Provides @Singleton WebSecurityManager securityManager(Realm realm) {
      DefaultWebSecurityManager sm = new DefaultWebSecurityManager();
      sm.setRealm(realm);
      return sm;
    }
  1. 继承Shiro过滤器中的一个,以便您可以使用Guice提供的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. 配置您的过滤器:
    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);

谢谢您提供完整的代码!那么最终配置文件必须以ini格式呈现,是吗? - newbie
Ini是可选的,您可以在提供程序方法中手动配置WebSecurityManager。 - sanjary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接