1

EJBContext.getCallerPrincipal() を使用してユーザー名を取得したい

public class GlobalInterceptor {

    @EJB
    private  AuditLogsEJB auditLogsEJB;

    @Resource
    private EJBContext context;

    @AroundInvoke
    public Object auditLog(InvocationContext invocationContext) throws Exception
    {  
          System.out.println(context.getCallerPrincipal());  //it outputs "ANONYMOUS"
    }
}

ただし、セキュリティ レルムはありません。 <security-role> または <group-name> が定義されていません。これは、ユーザー名/パスワードがリモート アプリケーションに送信されて検証されるためです。しかし、便宜上、プリンシパル クラスを使用してユーザー名とロールを取得したいと考えています。

インターセプターが取得できるように、JSF マネージド Bean または任意の EJB でプリンシパル (ユーザー名とロール) をプログラムで設定する方法はありますか? 例えば:

String role = authenticationWSPort.validate(username, password);
if(role != null) 
{
      Principal p = new Principal(username);
      p.getRoles.add(role);
      FacesContext.getCurrentInstance().blah-blah.blah-blah.addPrincipal(p);
      //I am looking for something similar to the 3 lines above
}
else
     // invalid username and password
4

1 に答える 1

0

明らかに、これを行う正しい方法は、レルムを設定し、それを使用することです。

おそらく、サーブレットで request.login(username, password) を呼び出す前に、その場でユーザーを作成できる独自の Realm 実装を作成および構成できます。

または。

基礎となる Request を使いこなしたい場合は可能ですが、それはアプリケーション サーバー固有であり、Tomcat (catalina) ベースのコンテナーにいると仮定すると、次のようになります。

if (request instanceof RequestFacade) {
        Request unwrapped = null;
        RequestFacade rf = RequestFacade.class.cast(request);
        try {
            Field requestField = rf.getClass().getDeclaredField("request");
            requestField.setAccessible(true);
            unwrapped = Request.class.cast(requestField.get(rf));
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
            unwrapped = null;
        }

        if (unwrapped != null) {
            unwrapped.setUserPrincipal(... your principal construction here ...);
        }
    }
于 2013-04-26T21:01:22.040 に答える