目次
従来の AOP
拡張機能
Interceptor
実装
Extension
ArgumentResolver
実装
Filter
扩展
ホームページ Java &#&チュートリアル Springboot がユニバーサル Auth 認証を実装する方法

Springboot がユニバーサル Auth 認証を実装する方法

May 14, 2023 am 11:31 AM
springboot auth

従来の AOP

この要件について、最初に思い浮かぶのは、もちろん Spring-boot によって提供される AOP インターフェイスです。必要なのは、Controller メソッドの前にポイントカットを追加してから、ポイントカット。

実装

手順は次のとおりです:

  1. @Aspect を使用してアスペクト クラス WhitelistAspect を宣言します;

  2. アスペクト クラスにポイントカットwhitelistPointcut()を追加します。このポイントカットの柔軟でアセンブリ可能な機能を実現するために、実行を使用してすべてをインターセプトするのではなく、アノテーション @Whitelist を追加します。 、注釈付きのメソッドはホワイトリストがチェックされます。

  3. アスペクト クラスで Spring の AOP アノテーション @Before を使用して通知メソッド checkWhitelist() を宣言し、Controller メソッドが実行される前にホワイトリストを検証します。

アスペクト クラスの疑似コードは次のとおりです。

 @Aspect
  public class WhitelistAspect {

    @Before(value = "whitelistPointcut() && @annotation(whitelist)")
    public void checkAppkeyWhitelist(JoinPoint joinPoint, Whitelist whitelist) {
        checkWhitelist();
        // 可使用 joinPoint.getArgs() 获取Controller方法的参数
        // 可以使用 whitelist 变量获取注解参数
    }

    @Pointcut("@annotation(com.zhenbianshu.Whitelist)")
    public void whitelistPointCut() {
    }
  }
ログイン後にコピー

Controller メソッドに @Whitelist アノテーションを追加して機能を実装します。

拡張機能

この例では、アノテーションはポイントカットの宣言に使用されており、検証されるホワイトリストを宣言するためにアノテーション パラメーターを実装しました。後で他のホワイトリストを追加する必要がある場合は、リストが UID によって検証される場合、このアノテーションに uid() などのメソッドを追加してカスタム検証を実装できます。

さらに、Spring の AOP では、execution (実行メソッド)、Bean (特定の名前に一致する Bean オブジェクトの実行メソッド)、@Around (ターゲットの実行時に実行される) などのポイントカット宣言メソッドもサポートされています。 function) 、 @After (メソッド実行後) およびその他の通知メソッド。

つまり、機能は実装されましたが、リーダーは満足していません =_=。その理由は、プロジェクトで AOP が多用されすぎているためです。彼は、方法を変更することを提案しました。 。まあ、始めるしかなかった。こちらにも注目:馬源技術コラム、背景にある回答:大手インターネット企業の面接質問集の最新版高精細PDF 3625ページ「面接ガイド」を入手できます。

Interceptor

Spring の Interceptor も、この関数の実装に非常に適しています。名前が示すように、インターセプターは、コントローラーのアクションが実行される前に、いくつかのパラメーターを通じてこのメソッドを実行するかどうかを決定するために使用されます。インターセプターを実装するには、Spring の HandlerInterceptor インターフェイスを実装できます。

実装

実装手順は次のとおりです。

  1. インターセプタ クラス AppkeyInterceptor クラスを定義し、HandlerInterceptor インターフェイスを実装します。

  2. preHandle() メソッドを実装します;

  3. preHandle メソッドの注釈とパラメータを使用して、リクエストをインターセプトする必要があるかどうかを判断します。リクエストをインターセプトすると、インターフェイスは false を返します。

  4. #このインターセプターをカスタム WebMvcConfigurerAdapter クラスに登録します。

#AppkeyInterceptor クラスは次のとおりです:

@Component
public class WhitelistInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Whitelist whitelist = ((HandlerMethod) handler).getMethodAnnotation(Whitelist.class);
        // whitelist.values(); 通过 request 获取请求参数,通过 whitelist 变量获取注解参数
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  // 方法在Controller方法执行结束后执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  // 在view视图渲染完成后执行
    }
}
ログイン後にコピー

Extension

インターセプターを有効にするには、明示的に構成する必要もあります。ここでは、WebMvcConfigurerAdapter を使用して構成します。それを継承する MvcConfiguration が ComponentScan パス内にある必要があることに注意してください。

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WhitelistInterceptor()).addPathPatterns("/*").order(1);
        // 这里可以配置拦截器启用的 path 的顺序,在有多个拦截器存在时,任一拦截器返回 false 都会使后续的请求方法不再执行
    }
}
ログイン後にコピー

また、インターセプターが正常に実行された後の応答コードは 200 ですが、応答データは空であることに注意してください。
インターセプターを使用して関数を実装した後、リーダーはついに大きな手を思いつきました。すでに Auth パラメーターがあり、Appkey は Auth パラメーターから取得でき、ホワイトリストの有無を使用できます。認証の方法として使用されています。なぜですか? 認証中に検証が行われないのですか?うーん…吐血。

ArgumentResolver

パラメータ パーサーは、カスタム パラメータを解析するために Spring によって提供されるツールです。一般的に使用される @RequestParam アノテーションには影があります。これを使用すると、パラメータは次のように結合されます。コントローラーアクションに入る前に必要なもの。 Spring は ResolverList を維持します。リクエストが到着すると、Spring はカスタム型パラメータ (非基本型) があることを検出し、リゾルバが必要なパラメータを解析できるまでこれらのリゾルバを順番に試します。パラメーター リゾルバーを実装するには、HandlerMethodArgumentResolver インターフェイスを実装する必要があります。

実装

  • カスタム パラメータ タイプ AuthParam を定義します。クラスには appkey 関連フィールドがあります。

  • 定義AuthParamResolver そして、HandlerMethodArgumentResolver インターフェイスを実装します;

  • AuthParam を AuthParamResolver に適応させるために、supportsParameter() インターフェイス メソッドを実装します;

  • resolveArgument() インターフェイスを実装します解決するメソッド reqest オブジェクトは AuthParam オブジェクトを生成し、ここで AuthParam を検証してアプリキーがホワイトリストにあるかどうかを確認します。

  • コントローラー アクション メソッドの署名に AuthParam パラメーターを追加します。このリゾルバーを有効にするには;

実装された AuthParamResolver クラスは次のとおりです:

@Component
public class AuthParamResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(AuthParam.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        Whitelist whitelist = parameter.getMethodAnnotation(Whitelist.class);
        // 通过 webRequest 和 whitelist 校验白名单
        return new AuthParam();
    }
}
ログイン後にコピー

Extension

もちろん、パラメータパーサーも別途設定する必要があり、WebMvcConfigurerAdapter での設定も必要です:

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new AuthParamResolver());
    }
}
ログイン後にコピー

今回実装が完了した後も少し不安があったので、ネットで調べてみました。この機能を実現する別の方法を検討したところ、フィルターが一般的な方法であることがわかりました。

Filter

Filter 并不是 Spring 提供的,它是在 Servlet 规范中定义的,是 Servlet 容器支持的。被 Filter 过滤的请求,不会派发到 Spring 容器中。它的实现也比较简单,实现 javax.servlet.Filter接口即可。

由于不在 Spring 容器中,Filter 获取不到 Spring 容器的资源,只能使用原生 Java 的 ServletRequest 和 ServletResponse 来获取请求参数。

另外,在一个 Filter 中要显示调用 FilterChain 的 doFilter 方法,不然认为请求被拦截。实现类似:
public class WhitelistFilter implements javax.servlet.Filter {

@Override
    public void init(FilterConfig filterConfig) throws ServletException {
  // 初始化后被调用一次
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
     // 判断是否需要拦截
       chain.doFilter(request, response); // 请求通过要显示调用
    }

    @Override
    public void destroy() {
     // 被销毁时调用一次
    }
}
ログイン後にコピー

扩展

Filter 也需要显示配置:

@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean someFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new WhitelistFilter());
        registration.addUrlPatterns("/*");
        registration.setName("whitelistFilter");
        registration.setOrder(1); // 设置过滤器被调用的顺序
        return registration;
    }
}
ログイン後にコピー

以上がSpringboot がユニバーサル Auth 認証を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Springboot が Jasypt を統合して構成ファイルの暗号化を実装する方法 Springboot が Jasypt を統合して構成ファイルの暗号化を実装する方法 Jun 01, 2023 am 08:55 AM

Jasypt の概要 Jasypt は、開発者が最小限の労力で基本的な暗号化機能を自分のプロジェクトに追加できる Java ライブラリであり、暗号化の仕組みを深く理解する必要はありません。一方向および双方向暗号化の高いセキュリティ。標準ベースの暗号化テクノロジー。パスワード、テキスト、数値、バイナリを暗号化します... Spring ベースのアプリケーション、オープン API への統合、JCE プロバイダーでの使用に適しています... 次の依存関係を追加します: com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1 Jasypt の特典はシステムのセキュリティを保護し、コードが漏洩した場合でもデータ ソースは保証されます。

SpringBoot が Redisson を統合して遅延キューを実装する方法 SpringBoot が Redisson を統合して遅延キューを実装する方法 May 30, 2023 pm 02:40 PM

使用シナリオ 1. 注文は正常に行われましたが、支払いが 30 分以内に行われませんでした。支払いがタイムアウトになり、注文が自動的にキャンセルされました 2. 注文に署名があり、署名後 7 日間評価が行われませんでした。注文がタイムアウトして評価されない場合、システムはデフォルトでプラスの評価を設定します 3. 注文は正常に行われます。販売者が 5 分間注文を受け取らない場合、注文はキャンセルされます。 4. 配送がタイムアウトします。 SMS リマインダーをプッシュします... 遅延が長く、リアルタイム パフォーマンスが低いシナリオでは、タスク スケジュールを使用して定期的なポーリング処理を実行できます。例: xxl-job 今日は選択します

Redis を使用して SpringBoot に分散ロックを実装する方法 Redis を使用して SpringBoot に分散ロックを実装する方法 Jun 03, 2023 am 08:16 AM

1. Redis は分散ロックの原則を実装しており、分散ロックが必要な理由 分散ロックについて話す前に、分散ロックが必要な理由を説明する必要があります。分散ロックの反対はスタンドアロン ロックです。マルチスレッド プログラムを作成するとき、共有変数を同時に操作することによって引き起こされるデータの問題を回避します。通常、ロックを使用して共有変数を相互に除外し、データの正確性を確保します。共有変数の使用範囲は同じプロセス内です。共有リソースを同時に操作する必要があるプロセスが複数ある場合、どうすれば相互排他的になるのでしょうか?今日のビジネス アプリケーションは通常マイクロサービス アーキテクチャであり、これは 1 つのアプリケーションが複数のプロセスをデプロイすることも意味します。複数のプロセスが MySQL の同じレコード行を変更する必要がある場合、順序の乱れた操作によって引き起こされるダーティ データを避けるために、分散が必要です。今回導入するスタイルはロックされています。ポイントを獲得したい

Springbootがjarパッケージにファイルを読み込んだ後にファイルにアクセスできない問題を解決する方法 Springbootがjarパッケージにファイルを読み込んだ後にファイルにアクセスできない問題を解決する方法 Jun 03, 2023 pm 04:38 PM

Springboot はファイルを読み取りますが、jar パッケージにパッケージ化した後、最新の開発にアクセスできません。jar パッケージにパッケージ化した後、Springboot がファイルを読み取れない状況があります。その理由は、パッケージ化後、ファイルの仮想パスが変更されるためです。は無効であり、ストリーム経由でのみアクセスできます。読み取ります。ファイルはリソースの下にあります publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

SpringBootとSpringMVCの比較と差異分析 SpringBootとSpringMVCの比較と差異分析 Dec 29, 2023 am 11:02 AM

SpringBoot と SpringMVC はどちらも Java 開発で一般的に使用されるフレームワークですが、それらの間には明らかな違いがいくつかあります。この記事では、これら 2 つのフレームワークの機能と使用法を調べ、その違いを比較します。まず、SpringBoot について学びましょう。 SpringBoot は、Spring フレームワークに基づいたアプリケーションの作成と展開を簡素化するために、Pivo​​tal チームによって開発されました。スタンドアロンの実行可能ファイルを構築するための高速かつ軽量な方法を提供します。

SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法 SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法 Jun 02, 2023 am 11:07 AM

Springboot+Mybatis-plus が SQL ステートメントを使用して複数テーブルの追加操作を実行しない場合、私が遭遇した問題は、テスト環境で思考をシミュレートすることによって分解されます: パラメーターを含む BrandDTO オブジェクトを作成し、パラメーターをバックグラウンドに渡すことをシミュレートします。 Mybatis-plus で複数テーブルの操作を実行するのは非常に難しいことを理解してください。Mybatis-plus-join などのツールを使用しない場合は、対応する Mapper.xml ファイルを設定し、臭くて長い ResultMap を設定するだけです。対応する SQL ステートメントを記述します。この方法は面倒に見えますが、柔軟性が高く、次のことが可能です。

SpringBoot が Redis をカスタマイズしてキャッシュのシリアル化を実装する方法 SpringBoot が Redis をカスタマイズしてキャッシュのシリアル化を実装する方法 Jun 03, 2023 am 11:32 AM

1. RedisAPI のデフォルトのシリアル化メカニズムである RedisTemplate1.1 をカスタマイズします。API ベースの Redis キャッシュ実装では、データ キャッシュ操作に RedisTemplate テンプレートを使用します。ここで、RedisTemplate クラスを開いて、クラスのソース コード情報を表示します。publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations、BeanClassLoaderAware{//キーを宣言、値の各種シリアル化メソッド、初期値は空 @NullableprivateRedisSe

Springbootでapplication.ymlの値を取得する方法 Springbootでapplication.ymlの値を取得する方法 Jun 03, 2023 pm 06:43 PM

プロジェクトでは、構成情報が必要になることがよくありますが、この情報はテスト環境と本番環境で構成が異なる場合があり、実際のビジネス状況に基づいて後で変更する必要がある場合があります。これらの構成をコードにハードコーディングすることはできません。構成ファイルに記述することをお勧めします。たとえば、この情報を application.yml ファイルに書き込むことができます。では、コード内でこのアドレスを取得または使用するにはどうすればよいでしょうか?方法は2つあります。方法 1: @Value アノテーションが付けられた ${key} を介して、構成ファイル (application.yml) 内のキーに対応する値を取得できます。この方法は、マイクロサービスが比較的少ない状況に適しています。方法 2: 実際には、プロジェクト、業務が複雑な場合、ロジック

See all articles