Внедрить управляемый компонент 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 (), означающий, что подкласс не может быть проксирован.
Любые мысли о том, как я могу обойти это?