W aplikacji, którą buduję używamy prostych Java 6 EE i JBoss (bez sprężyny itp.), Z JPA/Hibernate, JSF, CDI i EJB.Wstrzykiwanie zarządzanej fasoli CDI w niestandardowej Shiro AuthorisingRealm
Nie znalazłem wielu dobrych rozwiązań w zakresie bezpieczeństwa ogólnego (zalecenia są mile widziane), ale najlepszym znaleziskiem jest Apache Shiro.
Jednak wydaje się, że ma wiele niedociągnięć. Niektóre z nich można przeczytać w Balus C's strony:
http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
Ale ja natknąłem się na kolejny duży problem, który jest już wspomniano here dotyczące iniekcji zależność i proxy.
Zasadniczo mam dobrze napisaną UserDAO opartą na JPA, która zapewnia wszystko, co niezbędne do uwierzytelnienia. Moja baza danych jest starannie skonfigurowana w persistence.xml i mydatabase-ds.xml (dla JBoss).
Wydaje się głupim powtórzenie wszystkich tych informacji konfiguracyjnych po raz drugi i dodanie zapytań o tablice użytkowników do pliku shiro.ini. Dlatego właśnie zdecydowałem się napisać własne królestwo zamiast używać JdbcRealm.
Moja pierwsza próba była podklasy AuthorizingRealm ... coś jak:
@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;
}
}
Więc to nie bardzo złe, ponieważ nie można MyAppRealm proxy, ponieważ nie jest ostateczna metody init() w klasie nadrzędnej w górę hierarchii klas.
Moja druga próba polegała na tym, aby MyAppRealm zaimplementował wszystkie potrzebne interfejsy i po prostu przekazał je do instancji AuthorizingRealm. Nie podobało mi się to, ale równie dobrze mógłbym spróbować.
To mnie pogłębia, aplikacja internetowa uruchamia się, ale nadal nie działa. Powodem jest to w pliku konfiguracyjnym, shiro.ini, określić klasę do mojego królestwa:
myAppRealm = com.myapp.MyAppRealm
To dość dużo mówi mi, że Shiro będzie odpowiedzialny za stworzenie MyAppRealm instancji. Dlatego nie będzie zarządzana CDI, a zatem nie zostanie wstrzyknięta, co jest dokładnie tym, co widzę.
Widziałem to SO answer, ale nie widzę, jak to możliwe, ponieważ ponownie podklasa AuthorizingRealm odziedziczy ostateczną metodę init(), co oznacza, że podklasa nie może być proxy.
Jakieś przemyślenia na temat tego, jak sobie z tym poradzić?
Dziękuję za odpowiedź. Jest to bardzo dobra teoretyczna odpowiedź i pod tym względem uderza w gwóźdź w głowę. Myślę, że udało mi się zbudować "most" za pomocą beanmanager. Nie jest to całkiem ładne, ale mam nadzieję, że z czasem się rozwijam i udoskonalam. – lostdorje