首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >野生蝇15从登录用户的jax s中获取单例EJBContext

野生蝇15从登录用户的jax s中获取单例EJBContext
EN

Stack Overflow用户
提问于 2019-01-16 14:36:45
回答 1查看 472关注 0票数 1

我希望从登录用户中获取单例中的调用方主体。用户使用用户名/密码对rest服务进行身份验证。

在战争中,安全域位于jboss-web.xml中。

代码语言:javascript
复制
<security-domain>application-security</security-domain>

战争的终点是:

代码语言:javascript
复制
@Path("/message/{message}")
public class MyRessource
{  
   @EJB
   MySingleton singletonBean;

   @GET
   public Response resource(@PathParam("message") String message)
   {        
        singletonBean.printText(message);
        System.out.println("called from: " + ctx.getUserPrincipal().getName());
}

单例在自己的项目中,在战争中作为依赖关系提供。

代码语言:javascript
复制
@Stateless
public class MySingletonBean implements MySingleton
{

    @Resource
    EJBContext context;

    @Resource
    SessionContext ctx;

  public void printText(String text) {
      System.out.println(text + ":: EJBContext: " + context.getCallerPrincipal().getName() + "  SessionContext: " + ctx.getCallerPrincipal().getName());      
  }

}

我的web.xml:

代码语言:javascript
复制
<web-app>
    <security-role>
        <role-name>Admin</role-name>
    </security-role>

    <security-constraint>
        <web-resource-collection>
            <url-pattern>/*</url-pattern>
            <http-method-omission>OPTIONS</http-method-omission>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Admin</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>
</web-app>

standalone-full-ha.xml

代码语言:javascript
复制
<subsystem xmlns="urn:wildfly:elytron:5.0" ...>
   [...]
   <security-domain name="application-security" default-realm="application-properties" permission-mapper="default-permission-mapper">
      <realm name="application-properties"/>
   </security-domain>
   [...]
</subsystem>
   [...]

<http-authentication-factory name="application-security-http" security-domain="application-security" http-server-mechanism-factory="global">
   <mechanism-configuration>
      <mechanism mechanism-name="BASIC"/>
   </mechanism-configuration>
</http-authentication-factory>
[...]

<security-domains>
   <security-domain name="application-security" default-realm="application-properties" permission-mapper="default-permission-mapper">
      <realm name="application-properties"/>
    </security-domain>
   [...]
</security-domains>
[...]

<subsystem xmlns="urn:jboss:domain:security:2.0">
   <security-domains>
      <security-domain name="application-security">
         <authentication>
            <login-module code="UsersRoles" flag="required">
               <module-option name="usersProperties" value="file://${jboss.server.config.dir}/context-users.properties"/>
                <module-option name="rolesProperties" value="file://${jboss.server.config.dir}/context-roles.properties"/>
             </login-module>
          </authentication>
     </security-domain>
     [...]
</subsystem>
[...]

<subsystem xmlns="urn:boss:domain:undertow"...>
    <application-security-domains>
        <application-security-domain name="application-security" http-authentication-factory="application-security-http"/>
    </application-security-domains>
    [...]
</subsystem>

但作为校长我总是匿名的。

我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-20 06:42:43

你在这里至少有三个问题:

  1. <subsystem xmlns="urn:jboss:domain:security:2.0">是一个遗留的配置元素,它不与elytron连接;
  2. 您完全缺少了ejb3安全配置;
  3. 您的EJB方法不受@RolesAllowed(...)保护。

我有一个类似的例子:

  1. 创建realm:/subsystem=elytron/properties-realm=DemoPropsRealm:add(groups-attribute=groups,\ groups- properties ={\ path=演示-Roles.properties,相对-to=jboss.server.config.dir},\users properties={\path=dem-users.properties,相对-to=jboss.server.config.dir,纯文本=true})
  2. 创建一个elytron domain:/subsystem=elytron/security-domain=DemoDomain:add(\ realms={realm=DemoPropsRealm,角色-解码器=组到角色},\默认-领域=DemoPropsRealm,权限-映射器=默认-权限-映射器)
  3. 创建一个映射到我们的DemoDomain的elytron身份验证工厂: /subsystem=elytron/http-authentication-factory=demo-http-auth:add(\ http-服务器-工厂-工厂=全局,\安全-域=DemoDomain,\机械-配置=[{\机制-名称=基本,\机制-领域-配置={\领域-名称=DemoApplicationDomain\ }\ }])
  4. 将ejb3子系统应用程序安全域映射到我们的DemoDomain /子系统=ejb3 3/应用程序-安全性-域=\ DemoApplicationDomain:add(security-domain=DemoDomain)
  5. 将下面的子系统应用程序安全域链接到我们的http-身份验证-工厂: /subsystem=undertow/application-security-domain=\ DemoApplicationDomain:add(http-authentication-factory=demo-http-auth) "DemoApplicationDomain“将是web.xml的login-config元素中的领域名称,jboss-web.xml文件中的security-domain
  6. 在EJB方法上声明允许的角色: @RolesAllowed("Admin")公共printText(字符串文本){System.out.println(文本+:EJBContext:“+ context.getCallerPrincipal().getName() +”SessionContext:+ ctx.getCallerPrincipal().getName());}

示例源在GitHub at 雅克斯-奥斯中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54219391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档