content: /*
   * Copyright 1999-2018 Alibaba Group Holding Ltd.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.alibaba.csp.sentinel.dashboard.auth;
  
  /**
   * Interface for authentication and authorization.
   *
   * @author Carpenter Lee
   * @since 1.5.0
   */
  public interface AuthService<R> {
  
      /**
       * Get the authentication user.
       *
       * @param request the request contains the user information
       * @return the auth user represent the current user, when the user is illegal, a null value will return.
       */
      AuthUser getAuthUser(R request);
  
      /**
       * Privilege type.
       */
      enum PrivilegeType {
          /**
           * Read rule
           */
          READ_RULE,
          /**
           * Create or modify rule
           */
          WRITE_RULE,
          /**
           * Delete rule
           */
          DELETE_RULE,
          /**
           * Read metrics
           */
          READ_METRIC,
          /**
           * Add machine
           */
          ADD_MACHINE,
          /**
           * All privileges above are granted.
           */
          ALL
      }
  
      /**
       * Represents the current user.
       */
      interface AuthUser {
  
          /**
           * Query whether current user has the specific privilege to the target, the target
           * may be an app name or an ip address, or other destination.
           * <p>
           * This method will use return value to represent  whether user has the specific
           * privileges to the target, but to throw a RuntimeException to represent no auth
           * is also a good way.
           * </p>
           *
           * @param target        the target to check
           * @param privilegeType the privilege type to check
           * @return if current user has the specific privileges to the target, return true,
           * otherwise return false.
           */
          boolean authTarget(String target, PrivilegeType privilegeType);
  
          /**
           * Check whether current user is a super-user.
           *
           * @return if current user is super user return true, else return false.
           */
          boolean isSuperUser();
  
          /**
           * Get current user's nick name.
           *
           * @return current user's nick name.
           */
          String getNickName();
  
          /**
           * Get current user's login name.
           *
           * @return current user's login name.
           */
          String getLoginName();
  
          /**
           * Get current user's ID.
           *
           * @return ID of current user
           */
          String getId();
      }
  }
  