В приложении, которое я создаю, мы используем прямые Java 6 EE и JBoss (без Spring и т.д.), с JPA/Hibernate, JSF, CDI и EJB.
Я не нашел много хороших общих решений безопасности (рекомендации приветствуются), но лучшим выбором я нашел Apache Shiro.
Однако это, кажется, имеет ряд недостатков. Некоторые из которых вы можете прочитать в сайт Balus C:
http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
Но я наткнулся на еще одну большую проблему, о которой уже упоминалось здесь относительно инъекции зависимостей и проксирования.
В принципе, у меня есть хорошо написанная пользовательская платформа JPDA, которая предоставляет все необходимое для аутентификации. Моя база данных аккуратно настроена в 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. Мне это не понравилось, но я бы тоже попробовал.
Это добавляет меня дальше, webapp запускается, но все равно отстает. Причина в файле конфигурации: shiro.ini, я указываю класс для своего царства:
myAppRealm = com.myapp.MyAppRealm
Это в значительной степени говорит мне, что Shiro будет нести ответственность за создание экземпляра MyAppRealm. Поэтому он не будет управляться CDI и, следовательно, не будет инъецироваться, что я и вижу.
Я видел этот SO ответ, но я не вижу, как он может работать, потому что снова подкласс AuthorizationRealm наследует окончательный метод init() это означает, что подкласс не может быть проксирован.
Любые мысли о том, как я могу обойти это?