스프링북 비계 하나 공유

9804 단어 java-ee

프로젝트 소개


우리가 프로젝트를 개발할 때, 각 프로젝트 사이에는 항상 공용할 수 있는 코드나 설정이 있다. 만약 우리가 새로 만든 프로젝트마다 코드를 복사하고 붙여서 수정할 필요가 없다면.그래서 저는 poseidon-boot-starter 이 프로젝트는 spring-boot의 starter 기능을 바탕으로 개발한 것이기 때문에 spring-boot 프로젝트에만 적용됩니다.이 프로젝트에는 다음과 같은 기능이 통합되어 있습니다.
  • 이상 알림
  • 권한 구성
  • 로그 구성
  • 사용자 작업 로깅
  • 쿼리 인터페이스 공통화
  • 프로젝트 주소: https://github.com/muggle0/po...
    다음은 이 구성 요소가 우리spring-boot 프로젝트에서 어떻게 사용되는지 소개합니다.
    우선 이 항목을 다운로드해야 합니다.
    git clone https://github.com/muggle0/poseidon-boot-starter.git

    그리고 로컬 창고나 개인 클라우드에 설치합니다.
    cd poseidon-boot-starter
    
    mvn install

    설치가 완료되면 spring boot 프로젝트에 종속성 가져오기
    
        org.springframework.boot
        spring-boot-autoconfigure
     

    그런 다음 몇 가지 기본적인 구성을 수행합니다.
    poseidon.auto=true
    poseidon.static-path=/**/*.*
    poseidon.ignore-path=/**
    logging.config=classpath:poseidon-logback.xml
    log.dir=logs
    logging.level.com.muggle=debug
    spring.profiles.include=refresh
    

    자동화 설정은 기본적으로 켜지지 않습니다. 우리는 poseidon.auto=true를 사용하여 관련 기능을 사용해야 합니다. 자동화 설정을 켜면 두 개의 인터페이스를 실현하고spring용기에 주입해야 합니다. com.muggle.poseidon.store.SecurityStorecom.muggle.poseidon.service.TokenService.poseidon.static-pathant가 일치하는 정적 자원 경로로 이 규칙에 부합되는 URL은 권한 필터에 의해 차단되지 않으며poseidon.ignore-path감권 무시 규칙으로 이 규칙에 부합되는 URL은 감권에 참여하지 않고 직접 통과된다.logging.config=classpath:poseidon-logback.xmlposeidon-boot-starter의logback 설정 정책(오색찬란한 검은색)을 사용하고 이 설정을 사용하면 로그 파일 출력 경로를 지정해야 합니다.log.dir는 디버그 레벨로 출력할 패키지 이름을 지정하여 로그 디버깅을 보기 편리하게 합니다.logging.level.com.muggle=debugspring.profiles.include=refresh를 지정하면 현재 프로젝트의 모든 URL을 가져와 profile에 처리합니다.기본적으로 켜지지 않는 다른 기능도 원본 해독에 소개되어 있습니다.

    원본 코드 해독


    앞에서 언급한 바와 같이 이 프로젝트는springboot의 starter 기능을 바탕으로 개발된 것이다. 그 원리는 바로springboot 맞춤형 버전의spi이다. 여기에 많은 소개를 하지 않고 프로젝트에서 어떻게 사용하는지 소개한다.
    먼저 tokenService에 주입할 클래스를 지정합니다.
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.muggle.poseidon.auto.ExpansibilityConfig,\
    com.muggle.poseidon.auto.SecurityAutoConfig,\
    com.muggle.poseidon.handler.web.WebUrlHandler,\
    com.muggle.poseidon.handler.web.WebResultHandler
    META-INF/spring.factories는 예약된 설정 클래스로 실제 사용되지 않으며ExpansibilityConfig는 통합SecurityAutoConfig과 관련된 설정이다.spring-security는 특수한 URL을 처리한 것이다.WebUrlHandler는 통합 예외 처리 구성입니다.이 몇 가지 종류는 모두 WebResultHandler를 통해 자동 설정 여부를 제어한다.설정 클래스의 구체적인 원본 디테일은 여기에서 소개하지 않겠습니다.다음은 각 기능의 원본 코드를 해독하겠습니다.

    security


    프로젝트는 보안을 통합하고 프로세서와 감권 관련 클래스를 다시 작성하여 json으로 되돌려주고 요청 헤더에서 Token을 가져오는 방식으로 바뀌었습니다.우선 어떤 프로세서가 적혀 있는지 살펴보겠습니다.
  • @ConditionalOnProperty(prefix = "poseidon", name = "auto", havingValue = "true", matchIfMissing = false) 감지 실패 프로세서;
  • com.muggle.poseidon.handler.security.PoseidonAccessDeniedHandler 로그인 실패 프로세서;
  • com.muggle.poseidon.handler.security.PoseidonAuthenticationFailureHandler 성공 프로세서에 로그인합니다.
  • com.muggle.poseidon.handler.security.PoseidonAuthenticationSuccessHandler 프로세서에 로그인하지 않았습니다.
  • com.muggle.poseidon.handler.security.PoseidonLoginUrlAuthenticationEntryPoint 성공 프로세서가 로그아웃되었습니다.

  • 상기 몇 개의 프로세서는 json의 데이터를 되돌려줍니다. 만약 json 형식을 수정하거나 방향을 바꾸는 방식으로 바뀌어야 한다면 관련 프로세서를 수동으로 찾아서 수정해야 합니다.이 부분의 관련 작업(예를 들어 방향을 바꾸거나 정보를 제시하는 것)은 모두 전방에서 해결할 수 있기 때문에 여기는 확장 처리를 하지 않습니다.
    그 다음은 Token 필터com.muggle.poseidon.handler.security.PoseidonLogoutSuccessHandler입니다. 이 필터는 요청 헤더에서 Token을 먼저 얻고 실패하면 쿠키에서 Token을 받습니다. 키는 모두 Token입니다. Token을 받은 후 호출com.muggle.poseidon.filter.SecurityTokenFilter하면 하나securityStore.getUserdetail(String token)를 받습니다. 따라서 Token을 통해 사용자 정보를 얻으려면 사용자가 직접 확장해야 합니다. 데이터베이스에서 읽거나 캐시에서 읽거나 jwt처럼 직접 읽을 수 있습니다.분석을 통해 Token 생성.다음 감권 절차에서이 UserDetails 에서 UserDetails 집합과 URL을 함께 GrantedAuthority 가감권에 전달합니다. (IgnorePath와 일치하면 가감권이 직접 통과되지 않습니다.)이곳의 감권 방안도 사용자가 스스로 실현해야 한다. 감권 방안은 url와 일치하는 것을 통해 실현될 것이다. 그러면 디자인 방안을 어떻게 일치하는지 여러 가지 아이디어를 제공한다.
  • 설정rooleMatch(Collection extends GrantedAuthority> authorities, String path)을 할 때 프로젝트의 모든 URL과 관련된 swagger 주석을 가져옵니다.spring.profiles.include=refresh에 맡기면 데이터베이스에 저장하여 후속 감권에 근거를 제공할 수 있다.
  • 당신은 URL의 명칭 규칙을 제정할 수 있습니다. 감권이 있을 때TokenService.processUrl(List list)와 직접 일치하고 규칙을 통해 우리는 어떤 사용자가 접근할 권리가 있는지 직접 판단할 수 있습니다.
  • 전방에서 요청을 할 때 url 끝에 파라미터를 가지고 어떤 캐릭터가 접근할 수 있는지 지정한다(안전하지 않으며 위조 요청을 통해 감권을 뛰어넘을 수 있다).
  • GrantedAuthorityTokenService에는 로그인과 로그인 등 다른 관련 방법이 있습니다. 여기는 소개하지 않겠습니다. 원본 주석을 참고하십시오.

    통합 예외 처리


    통일 이상 처리와 관련된 유형은 SecurityStore이다. 이것은 일부 이상 정보의 처리 전략을 정의했다.이 정책들을 직접 삭제하거나 이상 프로세서를 다시 주입하는 것을 원하지 않는다면, 프로젝트에서readme를 참고할 수 있습니다.md 문서의 사례:
    @RestControllerAdvice
    @Configuration
    public class MyWebResultHandler extends WebResultHandler {
        private static final Logger log = LoggerFactory.getLogger(OAwebResultHandler.class);
        @ExceptionHandler({ConstraintViolationException.class})
        public ResultBean methodArgumentNotValidException(ConstraintViolationException e, HttpServletRequest req) {
            log.error("       ", e);
            ResultBean error = ResultBean.error(e.getConstraintViolations().iterator().next().getMessage());
            return error;
        }
    }

    주의해야 할 부분은 만약에 우리 프로젝트에 미지의 이상이 발생하면 중시를 받아야 하기 때문에 미지의 이상이 발생할 때 사건을 던진다.사용자는 감청기를 등록하여 이 사건을 감청할 수 있고 미지의 이상이 발생할 때 개발자에게 신속하게 통지할 수 있다. 예:
    @Component
    public class ExceptionListener implements ApplicationListener {
    
        @Override
        public void onApplicationEvent(ExceptionEvent event) {
            String message = event.getMessage();
            // TODO            ,          ,    。
        }
    }
    

    요청 로그 및 멱 잠금


    요청 로그 기능을 사용하려면 WebResultHandler 인터페이스를 실현하고spring 용기에 등록해서 로그 단면을 활성화해야 합니다.그리고 차단하는 방법DistributedLocker을 추가해야 합니다. 이 방법을 요청할 때 info 단계로 요청 파라미터를 로그에 입력합니다. 현재 로그 형식은 죽은 것으로 되어 있습니다. 형식은 다음과 같습니다.
    INFO  com.muggle.poseidon.aop.RequestAspect - 》》》》》》           :      url=/user/regester.jsonmethod=POSTip=127.0.0.1host=127.0.0.1port=57180classMethod=com.muggle.poseidon.oa.controller.UserController.regesterparamters [  (OaUserVO(gender=1, username=muggle, password=xxxxxx, email=null, imgUrl=null))  ]

    멱 등 차단을 하려면 주해에 파라미터@InterfaceAction를 추가해야 한다 @InterfaceAction(Idempotent = true,message = " , ")는 멱 등 차단을 켜는지 여부Idempotent는 차단된 후의 알림 정보이고 message는 멱 등 잠금 시간이다.차단을 켜면 키expertime를 연결하고 String key = "lock:idempotent:" + request.getRequestURI() + ":" + username + ":" + RequestUtils.getIP(request); 방법으로 자물쇠를 채웁니다. DistributedLocker.trylock(String key, Long express) 매개 변수는 주석에 설정express입니다. 자물쇠를 채우는 방식은 사용자가 직접 해야 합니다. 리디스,zookeeper, 또는 캐시로 자물쇠를 채울 수 있습니다.
    일부 사용자들은 요청과 관련된 정보를 데이터베이스에 저장하기를 원할 수도 있다. 나도 확장 인터페이스를 제공했다. expertime 이 인터페이스를 실현하고spring에 등록하면 RequestLogProcessor 방법에서 요청 관련 정보를 얻을 수 있다. recordBefore 방법에서 반환 값을 얻을 수 있다. 만약에 방법이 이상을 던지면 반환 값을 받지 못하므로 원본 코드를 수정하고 이상 절단 방법을 추가해야 한다.이상 절단 방법의 주해는 recordAfterReturning이다.

    로그 구성


    로그 설정은 주로 두 군데입니다. 하나는 @AfterThrowing 다른 하나는 banner.txt 파트너가 이banner를 싫어하는 경우, 자신의 프로젝트에 하나를 추가하여 덮어쓰면 됩니다.poseidon-logback.xml는 로그 형식 등에 대한 설정입니다. banner.txt을 통해 이 설정을 사용하려면 로그 파일 출력 경로poseidon-logback.xml를 지정해야 합니다. 이 설정을 사용하면 컨트롤러에서 알록달록한 검은색을 볼 수 있습니다. 만약 파트너가 이 배색을 좋아하지 않는다면 설정 파일의 주석에 따라 수정할 수 있습니다.

    질의 구성


    쿼리 설정을 하는 이 기능은 평소에 쿼리 인터페이스를 개발하는 개발 비용을 줄이기 위한 것이다. 이 기능 자체는 mybatislogging.config=classpath:poseidon-logback.xml 플러그인과 결합하여 사용하는 것이다. 만약에 이 플러그인을 사용하지 않는다면 이 혜택을 누릴 수 없다.
    각 회사나 조회 요구가 모두 같지 않기 때문에 이곳에서 나도 단지 최상위 추상화만을 했다.구체적인 조회 전략은 개발자가 실현해야 하며 확장성을 미리 남겨 두어야 한다.다음은 이 기능의 사고방식을 소개한다.
    검색 bean의 맨 윗부분은 log.dir=/temp/xxx로 추상적이며, 이 안에 검색의 일반적인 속성을 정의합니다.그리고 pagehelper에서 조회를 차단하는 방법은 차단 규칙은 클래스 이름이 com.muggle.poseidon.base.BaseQuery로 끝나야 하고 가입은 com.muggle.poseidon.aop.QueryAspect의 하위 클래스가 되어야 한다.
    이 절단면은 등록되지 않았습니다. 수동으로 등록해야 합니다.
        @Bean
        QueryAspect getQueryAspect(){
            return new QueryAspect();
        }

    절단면Controller에서 조회 파라미터를 전환하고BaseQuery에서 조회의 반환값을 다시 처리한다.실제 사용 중인 중소 파트너는 프로젝트 수요에 따라 확장하세요.

    일부 기초류의 포장

    doBefore(JoinPoint joinPoint) 공구류를 수집했습니다. 여러분, 필요에 따라 삭제하세요.doAfterReturning(JoinPoint joinPoint, Object result) 가방에 있는 com.muggle.poseidon.utilcom.muggle.poseidon.base층의 반환값에 대한 bean의 봉인입니다.com.muggle.poseidon.base.ResultBean 가방 아래는 사용자 정의 이상 상위 추상류입니다.

    결어


    현재 프로젝트는 BETA 버전만 발표했고 이후에 이 버전에 새로운 기능을 추가하지 않을 것입니다. 버전이 안정되면 이 버전을 바탕으로 REALSE 버전을 발표할 것입니다.만약 파트너가 버그를 발견하거나 개선 의견이 있거나 이 프로젝트에 대한 새로운 수요가 있으면 반드시 저에게 연락 주세요. 코드를 훑는 것이 쉽지 않으니 스타를 눌러서 지지해 주세요. 공이 왔어요.
    클릭하여 내 블로그 팔로우

    좋은 웹페이지 즐겨찾기