2016-03-22 8 views
0

HttpServiceを使用してOSGiバンドルにサーブレットを登録します。セキュリティを処理する独自のHttpContextクラスを作成しました - BasicAuthenticationとActiveDirectoryに対してチェックします。OSGiサーブレットでセキュリティを処理する際のユーザ役割の設定方法

Dictionary<String, String> params = new Hashtable<String, String>(); 
params.put("jersey.config.server.provider.classnames", SettingsService.class.getName()); 
HttpContext ctx = new HttpContext() 
{ 
    @Override 
    public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException 
    { 
     // validation against Active Directory here 
     return ADAuth.authenticate(request, response); 
    } 

    @Override 
    public URL getResource(String name) 
    { 
     return null; 
    } 

    @Override 
    public String getMimeType(String name) 
    { 
     return null; 
    } 
}; 
httpService.registerServlet("/rest", new MyServlet(), params, ctx); //$NON-NLS-1$ 

httpService.registerResources("/web", "/web", null); 

これまでのところとても良いです。私は@RolesAllowed注釈を使用できるように、ログインしたユーザーの役割を設定したいと考えています。役割はActive Directoryグループによって異なります。

どのように役割を設定しますか?

HttpSession session = request.getSession(true); 
    Subject subject = (Subject) session.getAttribute("javax.security.auth.subject"); 

    if (subject == null) { 
     subject = new Subject(); 
     subject.getPrincipals().add(new PlainRolePrincipal(groupName)); 
     session.setAttribute("javax.security.auth.subject", subject); 
    } 

しかし、request.isUserInRoleは常にfalseを返します。

更新

私はrequest.isUserInRoleに足を踏み入れるとき、私は最終的にこのコードを取得する:

if (_authentication instanceof Authentication.Deferred) 
    setAuthentication(((Authentication.Deferred)_authentication).authenticate(this)); 

if (_authentication instanceof Authentication.User) 
    return ((Authentication.User)_authentication).isUserInRole(_scope,role); 
return false; 

_authentication値はnullです。いつ/どこでこれを設定する必要がありますか?

答えて

0

新しいSubjectインスタンスのみを作成しました。これはセッション内のものを自動的には更新しません。

ジャーの問題とは別に、常にロールプリンシパルの標準がないということです。ロールをPlainRolePrincipalとしてエンコードすることを選択しました。私はこれが何を確認しているのか分からない。プリンシパルがロールプリンシパルであるかどうかを判断するには、そのコードを調べなければなりません。

典型的なケースは、特定のクラスまたはインターフェイス名を確認することですが、あなたのケースではどちらがよいかわかりません。

+0

ありがとうございました。良いキャッチ。残念ながら、私はちょうど質問に完全に私のコードをコピーしていない。問題はまだ残っています。 – paul

関連する問題