In un'app che sto costruendo usiamo Java 6 EE e JBoss diritti (no Spring, ecc.), Con JPA/Hibernate, JSF, CDI ed EJB.Inietta bean gestito CDI in Shiro personalizzato AuthorizingRealm
Non ho trovato molte buone soluzioni di sicurezza generale (i consigli sono benvenuti), ma la soluzione migliore che ho trovato è Apache Shiro.
Tuttavia questo sembra avere un numero di difetti. Alcuni dei quali si può leggere su a Balus C's sito:
http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
Ma mi hai inciampato su un altro grosso problema che è già menzionato here per quanto riguarda l'iniezione di dipendenza e il proxy.
Fondamentalmente ho un UserDAO basato su JPA ben scritto che fornisce tutto il necessario per l'autenticazione. Il mio database è ben configurato in persistence.xml e mydatabase-ds.xml (per JBoss).
Sembra stupido duplicare tutte queste informazioni di configurazione una seconda volta e aggiungere query alle tabelle utente in shiro.ini. Quindi è per questo che ho deciso di scrivere il mio Realm invece di usare JdbcRealm.
Il mio primo tentativo di questo è stato quello di creare una sottoclasse AuthorizingRealm ... qualcosa di simile:
@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;
}
}
Quindi questo non riesce piuttosto male, perché MyAppRealm non può essere approssimata perché c'è un init finale() metodo in una classe genitore la gerarchia delle classi.
Il mio secondo tentativo è stato quello di fare in modo che MyAppRealm implementasse tutte le interfacce necessarie e delegarle semplicemente a istanza di AuthorizingRealm. Non mi è piaciuto, ma potrebbe anche provarci.
Questo mi porta oltre, la webapp si avvia, ma non riesce ancora a farcela. La ragione è nel file di configurazione, shiro.ini, ho specificare la classe per il mio regno:
myAppRealm = com.myapp.MyAppRealm
Questo più o meno mi dice che Shiro sarà responsabile della creazione dell'istanza MyAppRealm. Pertanto non sarà gestito da CDI e quindi non iniettato, che è esattamente quello che sto vedendo.
Ho visto questo SO answer, ma non vedo come potrebbe funzionare perché ancora una sottoclasse di AuthorizingRealm erediterà un metodo init() finale che significa che la sottoclasse non può essere proxy.
Qualche idea su come posso aggirare questo?
Grazie per la risposta. Questa è un'ottima risposta teorica e in questo senso colpisce l'unghia sulla testa. Penso di aver costruito con successo un 'bridge' usando beanmanager. Non è esattamente carino, ma spero di evolverlo e perfezionarlo nel tempo. – lostdorje