ホームページ  >  記事  >  Java  >  Java の Spring AOP はユーザー権限の検証を実装します

Java の Spring AOP はユーザー権限の検証を実装します

高洛峰
高洛峰オリジナル
2017-02-03 13:19:221693ブラウズ

すべてのプロジェクトには権限管理システムがあります

単純なエンタープライズ Web サイトであっても、非常に複雑なプラットフォーム レベルのプロジェクトであっても、ユーザー ログインや権限管理などの重要なビジネス ロジックが含まれます。企業の Web サイトではどのような権限を管理する必要があるのか​​と言う人もいます。確かに、あなたのページは静的ページと呼ばれるかもしれませんが、それでもバックグラウンド管理とログイン機能があることは間違いありません。

どのプロジェクトもほぼ同じビジネスロジックを持つことになるが、それらを普遍的なシステムにできるだろうか?

AOPはユーザー権限検証を実装します

実際のプロジェクトでAOPが使用するシナリオは主に権限管理(Authority Management)、トランザクション管理(Transaction Management)、セキュリティ管理(Security)、ログ管理(Logging)、デバッグ管理(Debugging)が含まれます。待って。

つまり、AOP を使用して権限の検証を直接実装できます。プロジェクト内のアクセス許可を管理する方法と管理の粒度のレベルは完全にプロジェクトのニーズに依存するため、ここではまったく説明しません。

まずアイデアについて話しましょう。カスタム アノテーションとインターセプターを使用して、必要なときにパーミッション認証を実行します。ここで必要なのは、enum (列挙)、アノテーション (カスタム アノテーション)、およびインターセプター関連の知識です。これ以上の苦労はせずに、コードの作成を始めましょう。

コードで遊んでみましょう

** 1. AuthorityType.java 列挙クラスを作成します

public enum AuthorityType {
 
  // 登录和权限都验证 默认
  Validate,
 
  // 不验证
  NoValidate,
 
  // 不验证权限
  NoAuthority;
}

この列挙クラスの役割は、やはり使いたくなるようなカスタム アノテーションを作成することです。

2 番目に、新しい Authority.java カスタム アノテーション クラスを作成します

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Authority {
  // 默认验证
  AuthorityType value() default AuthorityType.Validate;
 
}

3 番目に、別の AuthorityAnnotationInterceptor.java クラスを作成します

/**
 * 权限认证拦截器
 *
 */
public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
 
  if (handler instanceof HandlerMethod) {
    HandlerMethod hm = (HandlerMethod) handler;
 
    Class<?> clazz = hm.getBeanType();
    Method m = hm.getMethod();
    try {
      if (clazz != null && m != null) {
        boolean isClzAnnotation = clazz.isAnnotationPresent(Authority.class);
        boolean isMethondAnnotation = m.isAnnotationPresent(Authority.class);
        Authority authority = null;
        // 如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。
        if (isMethondAnnotation) {
          authority = m.getAnnotation(Authority.class);
        } else if (isClzAnnotation) {
          authority = clazz.getAnnotation(Authority.class);
        }
        int code = -1;
        String msg = "";
        if (authority != null) {
          if (AuthorityType.NoValidate == authority.value()) {
            // 标记为不验证,放行
            return true;
          } else if (AuthorityType.NoAuthority == authority.value()) {
            // 不验证权限,验证是否登录
            // TODO:
            return true;
          } else {
            // 验证登录及权限
            // TODO:
 
            code = 1;
            msg = "验证成功!";
            return true;
          }
        }
 
        // //跳转
        // String url = "";
        // response.getWriter().write("<script>top.location.href=&#39;"
        // + url + "&#39;</script>");
        // return false;
 
        // 未通过验证,返回提示json
        Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put("code", code);
        responseMap.put("msg", msg);
        responseMap.put("params", "");
        responseMap.put("rows", "");
        String json = new Gson().toJson(responseMap);
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().write(json);
        return false;
      }
    } catch (Exception e) {
    }
  }
  return false;
  } 
}

このクラスの目的は、 のタグが付けられたメソッドとクラスを追加することです。権限 権限認証を行います。ビジネス ニーズに合わせて、完全認証、ログイン認証のみ、認証なしの 3 つのタイプに分けました。

ここでの戻り値は JSON 文字列にすることも、対応するページにジャンプして必要な効果を実現することもできます。

4. インターセプターを構成する

<mvc:interceptors>
  <!-- 权限认证拦截器 -->
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="cn.mayongfa.interceptor.AuthorityAnnotationInterceptor"></bean>
  </mvc:interceptor>
</mvc:interceptors>

ここでは、インターセプトする特定の URL を構成できます。

こちらで許可確認が完了しました。

使い方はとても簡単です

インターセプタの設定により、カスタムアノテーションのデフォルトは検証なので、クラス名とメソッド名にラベルを付けるだけで済みます。

Java之Spring AOP 实现用户权限验证

もちろん、すべてのリクエストを検証するようにインターセプターでデフォルトを設定し、その後リクエストを検証しないように設定することもできます。

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

ユーザー権限検証を実装する Java の Spring AOP に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

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