JASPIC ServerAuthModule 中的 CDI 注入不起作用
CDI injection in JASPIC ServerAuthModule doesn't work
在 Java 10.
上使用 Wildfly 11 Final
我有 JASPIC 实现,它本身可以正常工作。我需要将它连接到数据库,以便我可以在 public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {...}
中进行身份验证。但是 @Resource(mappedName="java:jboss/datasources/someDB") javax.sql.DataSource db;
对于 db
始终是 null
。
CDI 在同一个 WAR 存档中对任意 Servlet class 按预期工作 - 如果我将该行放在 Servlet class 中,它会给出 DataSource
对象。
我通过 private static InitialContext ic;
手动查找来解决这个问题,但我需要 CDI 来处理其他全局事务。有人遇到过这样的问题吗? WEB-INF/beans.xml
在 beans
元素中有一个 bean-discovery-mode="all"
属性。
public class SrvAuthModuleImpl implements ServerAuthModule {
@Resource(mappedName="java:jboss/datasources/someDB") javax.sql.DataSource db; //always null
private static InitialContext ic; //workaround via manual lookup
private CallbackHandler handler;
private Class<?>[] supportedMessageTypes = new Class[] {HttpServletRequest.class, HttpServletResponse.class};
@Override
public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, @SuppressWarnings("rawtypes") java.util.Map options) throws AuthException {
this.handler = handler;
}
@Override
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
try (
Connection c = getDb().getConnection(); //works
// Connection c = db.getConnection(); //db is null, exception thrown
) {
} catch (SQLException ex) {
}
return AuthStatus.SUCCESS;
}
@Override
public Class<?>[] getSupportedMessageTypes() {return supportedMessageTypes;}
@Override
public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException {return AuthStatus.SEND_SUCCESS;}
@Override
public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {}
private static javax.sql.DataSource getDb() {
try {
if (ic == null) {
synchronized(TestServerAuthModule.class) {
if (ic == null) {
ic = new javax.naming.InitialContext();
}
}
}
return (javax.sql.DataSource)ic.lookup("java:jboss/datasources/someDB");
} catch (Exception ex) {
return null;
}
}
}
这是意料之中的。 JASPIC 比 Resource Injection 或 CDI 更早,并且不支持两者。
在 Java EE 7 中,您可以使用
CDI.current().select(MyBean.class).get()
在非托管上下文中获取 CDI bean。
另一个选项是 Soteria,Java EE 8 Security API 的参考实现,它也适用于 WildFly 11。
在 Java 10.
上使用 Wildfly 11 Final我有 JASPIC 实现,它本身可以正常工作。我需要将它连接到数据库,以便我可以在 public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {...}
中进行身份验证。但是 @Resource(mappedName="java:jboss/datasources/someDB") javax.sql.DataSource db;
对于 db
始终是 null
。
CDI 在同一个 WAR 存档中对任意 Servlet class 按预期工作 - 如果我将该行放在 Servlet class 中,它会给出 DataSource
对象。
我通过 private static InitialContext ic;
手动查找来解决这个问题,但我需要 CDI 来处理其他全局事务。有人遇到过这样的问题吗? WEB-INF/beans.xml
在 beans
元素中有一个 bean-discovery-mode="all"
属性。
public class SrvAuthModuleImpl implements ServerAuthModule {
@Resource(mappedName="java:jboss/datasources/someDB") javax.sql.DataSource db; //always null
private static InitialContext ic; //workaround via manual lookup
private CallbackHandler handler;
private Class<?>[] supportedMessageTypes = new Class[] {HttpServletRequest.class, HttpServletResponse.class};
@Override
public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, @SuppressWarnings("rawtypes") java.util.Map options) throws AuthException {
this.handler = handler;
}
@Override
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
try (
Connection c = getDb().getConnection(); //works
// Connection c = db.getConnection(); //db is null, exception thrown
) {
} catch (SQLException ex) {
}
return AuthStatus.SUCCESS;
}
@Override
public Class<?>[] getSupportedMessageTypes() {return supportedMessageTypes;}
@Override
public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException {return AuthStatus.SEND_SUCCESS;}
@Override
public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {}
private static javax.sql.DataSource getDb() {
try {
if (ic == null) {
synchronized(TestServerAuthModule.class) {
if (ic == null) {
ic = new javax.naming.InitialContext();
}
}
}
return (javax.sql.DataSource)ic.lookup("java:jboss/datasources/someDB");
} catch (Exception ex) {
return null;
}
}
}
这是意料之中的。 JASPIC 比 Resource Injection 或 CDI 更早,并且不支持两者。
在 Java EE 7 中,您可以使用
CDI.current().select(MyBean.class).get()
在非托管上下文中获取 CDI bean。
另一个选项是 Soteria,Java EE 8 Security API 的参考实现,它也适用于 WildFly 11。