2012-05-08 5 views
1

Я хочу фильтровать свойства объекта на основе аутентификации или даже ролей. Так, например, полный профиль пользователя будет возвращен для аутентифицированного пользователя и filterd для не аутентифицированного.Фильтрация ответа JSON на основе аутентификации

Как я могу достичь этого с помощью MappingJacksonHttpMessageConverter? Я уже объявил пользовательские бобы для Jaskon:

<bean id="objectMapper" class="com.example.CustomObjectMapper"/> 

    <bean id="MappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
     <property name="objectMapper" ref="objectMapper"/> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="order" value="1" /> 
     <!-- <property name="customArgumentResolver" ref="sessionParamResolver"/> --> 
     <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <!-- <property name="conversionService" ref="conversionService" /> --> 
      <!-- <property name="validator" ref="validator" /> --> 
     </bean> 
     </property> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
       <ref bean="MappingJacksonHttpMessageConverter"/> 
      </list> 
     </property> 
    </bean> 

Примечание: В контроллерах я пишу результаты как:

public void writeJson (Object jsonBean, HttpServletResponse response) { 
     MediaType jsonMimeType = MediaType.APPLICATION_JSON; 
     if (jsonConverter.canWrite(jsonBean.getClass(), jsonMimeType)) { 
      try { 
       jsonConverter.write(jsonBean, jsonMimeType, new ServletServerHttpResponse(response)); 
      } catch (IOException m_Ioe) { 
      } catch (HttpMessageNotWritableException p_Nwe) { 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      log.info("json Converter cant write class " +jsonBean.getClass()); 
     } 
    } 

ответ

0

Если Вы желаете, чтобы вернуть два отдельных типа объектов JSON (например fullProfile и partialProfile), тогда вам будет выгоднее создавать две разные службы с двумя разными URL-адресами. Затем вы можете контролировать доступ к этим URL-адресам обычным способом с помощью тегов Spring.

0

Я сделал большую часть, что здесь https://stackoverflow.com/a/39168090/6761668

Все, что вам нужно сделать, это карандаш в ваших собственных правил безопасности, возможно, инъекционного текущего пользователя и решить, что включать или не основано на их роли. Я использовал аннотацию на колонке объекта:

import java.lang.annotation.Retention; 
    import java.lang.annotation.RetentionPolicy; 
    import java.util.Set; 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface MyRestricted { 
    String[] permittedRoles() default {}; 
    } 

Колонка выглядит следующим образом:

@Column(name = "DISCOUNT_RATE", columnDefinition = "decimal", precision = 7, scale = 2) 
    @MyRestricted(permittedRoles = { "accountsAdmin", "accountsSuperUser" }) 
    private BigDecimal discountRate; 

правила выглядит следующим образом:

final MyRestricted roleRestrictedProperty = pWriter.findAnnotation(MyRestricted.class); 
    if (roleRestrictedProperty == null) { 
     // public item 
     super.serializeAsField(pPojo, pJgen, pProvider, pWriter); 
     return; 
    } 

    // restricted - are we in role? 
    if (permittedRoles.contains(myRole)) { 
     super.serializeAsField(pPojo, pJgen, pProvider, pWriter); 
     return; 
    } 
    // Its a restricted item for ME 
    pWriter.serializeAsOmittedField(pPojo, pJgen, pProvider); 
Смежные вопросы