Внедрить управляемый компонент CDI в пользовательский Shiro AuthorizingRealm

В приложении, которое я создаю, мы используем Java 6 EE и JBoss (без Spring и т. Д.) С JPA / Hibernate, JSF, CDI и EJB.

Я не нашел много хороших решений для обеспечения общей безопасности (рекомендации приветствуются), но лучшая ставка, которую я нашел, - это Apache Shiro.

Однако это, похоже, имеет ряд недостатков. Некоторые из которых вы можете прочитать наБалус С сайт:

http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html

Но я наткнулся на еще одну большую проблему, которая уже упоминаласьВот относительно внедрения зависимости и проксирования.

По сути, у меня есть хорошо написанное основанное на JPA UserDAO, которое предоставляет все необходимое для аутентификации. Моя база данных аккуратно настроена в файлах persistence.xml и mydatabase-ds.xml (для JBoss).

Кажется глупым повторять всю эту информацию конфигурации и добавлять запросы к пользовательским таблицам в shiro.ini. Вот почему я решил написать свою собственную область вместо использования JdbcRealm.

Моей первой попыткой было создание подкласса AuthorizingRealm ... что-то вроде:

@Stateless
public MyAppRealm extends AuthorizingRealm {
    @Inject private UserAccess userAccess;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
        AuthenticationToken token) throws AuthenticationException {

        UsernamePasswordToken userPassToken = (UsernamePasswordToken) token;

        User user = userAccess.getUserByEmail(userPassToken.getUsername());
        if (user == null) {
            return null;
        }

        AuthenticationInfo info = new SimpleAuthenticationInfo();
        // set data in AuthenticationInfo based on data from the user object

        return info;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // TODO
        return null;
    }
}

Так что это очень плохо, потому что MyAppRealm не может быть прокси, потому что есть последний метод init () в родительском классе вверх по иерархии классов.

Моя вторая попытка состояла в том, чтобы MyAppRealm реализовал все необходимые интерфейсы и просто делегировал их экземпляру AuthorizingRealm. Мне это не понравилось, но можно попробовать.

Это дает мне дальнейшее, веб-приложение запускается, но все еще не хватает. Причина в файле конфигурации, shiro.ini, я указываю класс для моей области:

myAppRealm = com.myapp.MyAppRealm

Это в значительной степени говорит мне, что Широ будет отвечать за создание экземпляра MyAppRealm. Поэтому он не будет управляться CDI и, следовательно, не вводиться, что я и вижу.

Я видел это ТАКответ, но я не понимаю, как это могло бы работать, потому что снова подкласс AuthorizingRealm унаследует финальный метод init (), означающий, что подкласс не может быть проксирован.

Любые мысли о том, как я могу обойти это?

Ответы на вопрос(2)

Ваш ответ на вопрос