스프링북 비계 하나 공유
9804 단어 java-ee
프로젝트 소개
우리가 프로젝트를 개발할 때, 각 프로젝트 사이에는 항상 공용할 수 있는 코드나 설정이 있다. 만약 우리가 새로 만든 프로젝트마다 코드를 복사하고 붙여서 수정할 필요가 없다면.그래서 저는
poseidon-boot-starter
이 프로젝트는 spring-boot
의 starter 기능을 바탕으로 개발한 것이기 때문에 spring-boot
프로젝트에만 적용됩니다.이 프로젝트에는 다음과 같은 기능이 통합되어 있습니다.다음은 이 구성 요소가 우리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.SecurityStore
와 com.muggle.poseidon.service.TokenService
.poseidon.static-path
ant가 일치하는 정적 자원 경로로 이 규칙에 부합되는 URL은 권한 필터에 의해 차단되지 않으며poseidon.ignore-path
감권 무시 규칙으로 이 규칙에 부합되는 URL은 감권에 참여하지 않고 직접 통과된다.logging.config=classpath:poseidon-logback.xml
는 poseidon-boot-starter
의logback 설정 정책(오색찬란한 검은색)을 사용하고 이 설정을 사용하면 로그 파일 출력 경로를 지정해야 합니다.log.dir
는 디버그 레벨로 출력할 패키지 이름을 지정하여 로그 디버깅을 보기 편리하게 합니다.logging.level.com.muggle=debug
이spring.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
에 맡기면 데이터베이스에 저장하여 후속 감권에 근거를 제공할 수 있다.TokenService.processUrl(List list)
와 직접 일치하고 규칙을 통해 우리는 어떤 사용자가 접근할 권리가 있는지 직접 판단할 수 있습니다.GrantedAuthority
와TokenService
에는 로그인과 로그인 등 다른 관련 방법이 있습니다. 여기는 소개하지 않겠습니다. 원본 주석을 참고하십시오.통합 예외 처리
통일 이상 처리와 관련된 유형은
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
를 지정해야 합니다. 이 설정을 사용하면 컨트롤러에서 알록달록한 검은색을 볼 수 있습니다. 만약 파트너가 이 배색을 좋아하지 않는다면 설정 파일의 주석에 따라 수정할 수 있습니다.질의 구성
쿼리 설정을 하는 이 기능은 평소에 쿼리 인터페이스를 개발하는 개발 비용을 줄이기 위한 것이다. 이 기능 자체는 mybatis
logging.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.util
는 com.muggle.poseidon.base
층의 반환값에 대한 bean의 봉인입니다.com.muggle.poseidon.base.ResultBean
가방 아래는 사용자 정의 이상 상위 추상류입니다.결어
현재 프로젝트는 BETA 버전만 발표했고 이후에 이 버전에 새로운 기능을 추가하지 않을 것입니다. 버전이 안정되면 이 버전을 바탕으로 REALSE 버전을 발표할 것입니다.만약 파트너가 버그를 발견하거나 개선 의견이 있거나 이 프로젝트에 대한 새로운 수요가 있으면 반드시 저에게 연락 주세요. 코드를 훑는 것이 쉽지 않으니 스타를 눌러서 지지해 주세요. 공이 왔어요.
클릭하여 내 블로그 팔로우