2017-04-04 4 views
2

私はWildFly 10にJAX-RSアプリケーションを持っています。これは簡単な基本認証で保護されています。401レスポンスの内容を個別の形式に変更するにはどうすればよいですか?

それは、これまでに動作しますが、認証に失敗した場合、サーバーは私の所望の応答ではありません

<html> 
    <head> 
    <title>Error</title> 
    </head> 
    <body>Unauthorized</body> 
</html> 

で応答します。私はカスタマイズされた(json)応答を好むだろう。

どうすればいいですか?

  1. 私は、単純なUserRolesLoginModule(私の場合には十分である)と私のサーバー構成で新しいWildflyセキュリティドメインを設定した:

    <security-domain name="MySecurityDomain" cache-type="default"> 
        <authentication> 
        <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required"> 
         <module-option name="usersProperties" value="${jboss.server.config.dir}/users.properties"/> 
         <module-option name="rolesProperties" value="${jboss.server.config.dir}/roles.properties"/>        
         <module-option name="hashAlgorithm" value="MD5"/> 
         <module-option name="hashEncoding" value="base64"/> 
         <module-option name="hashCharset" value="UTF-8"/> 
         <module-option name="unauthenticatedIdentity" value="UnauthenticatedAccess"/> 
        </login-module>          
        </authentication> 
    </security-domain> 
    
  2. 私がこれまでにやった

    アプリ内のすべてのサービスに注釈を付けました:

     @SecurityDomain("MySecurityDomain") 
        @RolesAllowed({ "RoleFromPropertyFile", "AnotherRoleFromPropertyFile" }) 
    
  3. 私は...私はどんな成功せずに異なる多くのことを試してみましたweb.xmlファイルを持っているコンテンツ

    <jboss-web> 
         <security-domain>MySecurityDomain</security-domain> 
        </jboss-web> 
    
  4. で:-(
    現在のコンテンツのjboss-web.xmlの作成:

    <security-constraint> 
         <display-name>Deny all HTTP methods except GET and POST</display-name> 
         <web-resource-collection> 
         <web-resource-name>NextTest</web-resource-name> 
         <url-pattern>/mypattern/*</url-pattern> 
         <http-method-omission>GET</http-method-omission> 
         <http-method-omission>POST</http-method-omission> 
        </web-resource-collection>  
        </security-constraint> 
        <login-config> 
        <auth-method>BASIC</auth-method> 
        <realm-name>MySecurityRealm</realm-name> 
        </login-config> 
        <security-role> 
        <description>Access to all application parts</description> 
        <role-name>all</role-name> 
    </security-role>  
    <!-- and some more roles --> 
    
  5. また、私自身の応答を生成するためにExceptionMapper<EJBAccessException>を実装しました。しかし、このマッパーは、web.xmlのすべてのコンテンツを削除したときにのみ到達します。

私の推測では、許可が行われており、不正アクセスに対する応答を処理していると思います。 web.xmlのセキュリティ設定を削除すると、EJBにアクセスできますが、BasicAuthヘッダーは評価されません。この場合、すべての要求は拒否されます。

可能であれば、サーブレットを作成せずにExceptionMapperを使用することをお勧めします。

私が逃したアイデアはありますか?

答えて

0

私はいくつかのコードを少し実験を行なったし、それはかなりありませんが、あなたのような何かを試みることができる:

import java.io.IOException; 

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class AuthBodyResponseFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, 
         ContainerResponseContext responseContext) throws IOException { 

     if((responseContext.getStatus() == 401) && 
      (responseContext.getEntity() instanceof String)) 
      responseContext.setEntity("no services for you!"); 
    } 
} 

私はそれを少しテストし、動作するようですが。もちろん、挑戦は、Stringレスポンス本体を持つ401がどこにあるのでしょうか?これがすべてをカバーしているかどうかをもっと調べなければならないだろう。ここで

0

は、私はそれを行う方法です。

@POST 
@Consumes("application/json") 
@Produces("application/json") 
public Response create(Entity entity) { 
    try { 
     Entity created = service().create(entity); 
     return Response.created(location(created)).entity(created).build(); 
    } catch (ServiceException e) { 
     return Response.status(e.getStatus()).entity(e).build(); 
    } 
} 

は、戻り値の型、Responseに注意してください。これにより、ヘッダーの設定などのレスポンスをカスタマイズすることができます。これは、配線コードをさらに記述する必要があることを意味します。

ここでは、すでにステータスが入っているカスタムServiceExceptionを使用しています。これを使用してレスポンスコードを設定しています。それからJSONとして返される例外自体を渡します。

関連する問題