我正在开发第一次使用ejb安全功能的JavaEE应用程序(尝试...)。 我正在使用WildFly 10.1。 我创建了一个Jdbc安全域并配置了基于表单的登录。访问Web方法和URL路径以及登录工作权限(阻止访问未经授权的访问权限并在登录后授权访问)。
我有一组实现(Jax-RS)REST接口的bean,我有一组ejb无状态bean,它实现了我的应用程序的业务逻辑。
这些是jboss-web.xml和web.xml的剪辑:
<jboss-web>
<security-domain>myDomain</security-domain>
</jboss-web>
的web.xml:
<security-constraint>
<web-resource-collection>
<url-pattern>/api/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrator</role-name>
<role-name>operator</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config><!-- 3 -->
<auth-method>FORM</auth-method>
<realm-name>myRealm</realm-name>
<form-login-config>
<form-login-page>/public/login.html</form-login-page>
<form-error-page>/public/error.html</form-error-page>
</form-login-config>
</login-config>
下面是实现REST接口和java bean的代码示例,我删除了bolerplate代码并混淆了我的&#34;用例&#34;相关名称。 一个Jax-RS bean的示例:
@Stateless
@Path("api/my")
public class myFacadeREST {
@EJB
myFacade myFacade;
@Context //injected response proxy supporting multiple threads
private HttpServletResponse response;
@POST
@Consumes({MediaType.APPLICATION_JSON})
public void create(DataStuff entity) {
myFacade.create(entity);
}
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON})
public DataStuff find(@PathParam("id") String id) {
return myFacade.find(id);
}
}
注入EJB的片段,我需要以编程方式访问安全上下文和主要信息:
@DeclareRoles({"administrator","operator","user"})
@PermitAll
@Stateless
public class myFacade {
@PersistenceContext(unitName = "myPersistencePU")
private EntityManager em;
@Context SecurityContext securityContext;
@Resource SecurityContext sc; //I have tried both :-(
public DataStuff find(Object id) {
//Here I get a NullPointerException, tried both sc and securitycontext
String username = securityContext.getUserPrincipal().getName();
if(username.equals("gino"){
return null;
}
return getEntityManager().find(entityClass, id);
}
}
我尝试过使用和不使用@DeclareRoles,@ PermitAll,但是securityContext和sc变量总是为null。也许我会错过一些东西,但我已经明白安全信息会神奇地通过bean调用。
问题
提前谢谢你 此致
答案 0 :(得分:0)
我找到了答案,问题已经被问到here
SecurityContext仅适用于JAX-RS bean,需要将一个EJBContext对象替换为SecurityContext,并将其注入其他java bean。 您也可以使用SessionContext对象,但EJBContext接口类似于SecurityContext对象。这是工作版本:
@DeclareRoles({"administrator","operator","user"})
@PermitAll
@Stateless
public class myFacade {
@PersistenceContext(unitName = "myPersistencePU")
private EntityManager em;
@Resource EJBContext securityContext;
public DataStuff find(Object id) {
//Now the securityContext is != null :-D
String username = securityContext.getCallerPrincipal().getName();
if(username.equals("gino"){
return null;
}
return getEntityManager().find(entityClass, id);
}
}