Spring расширяет объект аутентификации, чтобы сохранить контроллер сухим - PullRequest
0 голосов
/ 22 января 2019
public List<MyObject> find( Authentication auth )
      //read details off the authentication object.
      OAuth2AuthenticationDetails oauthDetails= (OAuth2AuthenticationDetails) auth.getDetails();
      HashMap<String, Object> additionalInformationMap = ( HashMap<String, Object> )oauthDetails.getDecodedDetails();

В настоящее время в моем контроллере есть небольшой кусочек кода, который считывает дополнительную информацию, хранящуюся в токене JWT.

Желательно, чтобы я не хотел писать этот код в нескольких методах контроллера, так какбудет перчинен по всей базе кода.

Есть ли лучший способ сделать это весной, которого нет в контроллере.например, можно ли расширить объект аутентификации в фильтре или в чем-то еще и добавить эти дополнительные данные в открытый метод расширенного объекта?

Редактировать.после прочтения получается, что АОП потенциально решит эту проблему.Просто не уверен, с чего начать

1 Ответ

0 голосов
/ 23 января 2019

Определите аннотацию, которая может быть применена к методам и классам. Если он применяется к классу, аннотация просто каскадируется и применяется ко всем методам в классе.

package com.perfectcomputersolutions.pos.annotation;

import org.springframework.stereotype.Component;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Component
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoNullArgs {
}

Затем создайте класс с советом (метод применения) для серии точечных разрезов (мест, где можно применить фактический совет). Примечание. Это пример, реализованный в Groovy, который просто проверяет, что все аргументы не равны NULL. Однако вы можете изменить тело метода так, чтобы оно делало все, что вы хотите. Если у вас есть массив args, это те значения, которые вы можете привести к ожидаемому типу.

package com.perfectcomputersolutions.pos.aspect

import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.reflect.CodeSignature
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component

@Aspect
@Order(0)
@Component
class NoNullArgsAspect {

    // Use this if writing in Java.
    // omitting the getMetaClass call is only for Groovy

    // @Before(
    //         value = "@within(com.perfectcomputersolutions.pos.annotation.NoNullArgs) || @annotation(com.perfectcomputersolutions.pos.annotation.NoNullArgs)"
    // )

    @Before(
            value = "!execution(* *.getMetaClass(..)) && @within(com.perfectcomputersolutions.pos.annotation.NoNullArgs) || @annotation(com.perfectcomputersolutions.pos.annotation.NoNullArgs)"
    )
    void requireNotNull(JoinPoint jp) {

        def method = (CodeSignature) jp.signature
        def types  = method.parameterTypes
        def names  = method.parameterNames
        def args   = jp.args

        for (int i = 0; i < types.length; i++)
            Objects.requireNonNull(args[i], "Parameter ${names[i]} must not be null" as String)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...