1つ、コメントを追加します
/ *** インターフェイスパラメータで現在ログインしているユーザーオブジェクトをバインドするために使用されるマークアノテーション* @ author yanghui * @date 2020/12/17 ** / @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType .PARAMETER}) @ Documented public @interface LoginUser { }
2.loginUserアノテーションのパーサーを作成します
/ ** *カスタムパラメーターパーサー *関数:ログインしたユーザーオブジェクトを取得し、メソッドパラメーターにバインドします * @author yanghui * @date 2020/12/17 ** / public class LoginUserHandlerMethodArgumentResolverimplements HandlerMethodArgumentResolver { @Override public boolean supportParameter (MethodParameter methodParameter){ return methodParameter.hasParameterAnnotation(LoginUser.class); } @Override public Object resolveArgument (MethodParameter methodParameter、ModelAndViewContainer modelAndViewContainer、NativeWebRequest nativeWebRequest、WebDataBinderFactory webDataBinderFactory)throws Exception { WebRequestget.N) if(nativeWebRequest)instance of HttpServletRequest.getNativeRequest() HttpServletRequestリクエスト=(HttpServletRequest)nativeWebRequest.getNativeRequest(); request.getAttribute( "LOGIN_USER");を返します。 } nullを返します。 } }
3、カスタムインターセプター
パブリッククラスWebInterceptorはHandlerInterceptorを実装します{ @Autowiredprivate RedisUtil redisUtil; @Override public boolean preHandle(HttpServletRequest request、HttpServletResponse response、Object handler)throws Exception { //ログインしたユーザーに移動し、redisに移動してリクエストに入れます2番目にリクエストのユーザー情報を取得してアノテーションに入れ ます。Authenticationauthentication= SecurityContextHolder.getContext()。getAuthentication(); SimpleUser simpleUser = new SimpleUser(); if(authentication!= null && authentication.getDetails() != null){ if(authentication.getDetails()instanceof OAuth2AuthenticationDetails){ OAuth2AuthenticationDetails details =(OAuth2AuthenticationDetails)authentication.getDetails(); オブジェクトobj = redisUtil.get(details.getTokenValue()); if(obj!= null){ simpleUser = JSON.parseObject(obj.toString()、SimpleUser.class); } else { String userName =(String)authentication.getPrincipal(); simpleUser.setUsername(userName); } } else if(UsernamePasswordAuthenticationTokenの認証インスタンス){ simpleUser =(SimpleUser)authentication.getPrincipal(); } else if(authentication.getPrincipal()!= null){ simpleUser.setUsername(authentication.getPrincipal()。toString()); } } / **ログインオブジェクトを渡し、カスタムパラメータパーサーで使用します* / request.setAttribute( "LOGIN_USER"、simpleUser); trueを返します。 }
第4に、構成クラスを作成し、カスタムインターセプターとパラメーターパーサーを追加します
@Configuration public class WebInterceptorConfigimplements WebMvcConfigurer { / ** *カスタムパラメータパーサー *関数:ログインしたユーザーオブジェクトを取得し、メソッドのパラメータにバインドします * @author yanghui * @date 2019/12/17 * @return LoginUserHandlerMethodArgumentResolver ** / @Bean 公共LoginUserHandlerMethodArgumentResolver getLoginUserHandlerMethodArgumentResolver(){ 戻り新しいLoginUserHandlerMethodArgumentResolver(); } / ** *ログイン検証インターセプター * * @return * / @Bean 公共WebInterceptor loginRequiredInterceptor(){ @Override )(新しいWebInterceptorを返します。 } public void addInterceptors(InterceptorRegistry Registry){ //ユーザー操作のアクセス許可を確認する必要があるリクエストを追加 registry.addInterceptor(loginRequiredInterceptor())。 addPathPatterns( "/ **"); } / ** * @ LoginUserパラメーターパーサーを追加 * @author yanghui * @date 2020/12/17 * @return void ** / @Override public void addArgumentResolvers(List <HandlerMethodArgumentResolver> argumentsResolvers){ argumentResolvers.add(getLoginUserHandlerMethodArgumentResolver()); } }
5. @LoginUser SimpleUserユーザーパラメーターをコントローラーインターフェイスパラメーターに追加して、使用します。