برنامه نویسی

سیستم مدیریت کاربر مبتنی بر Spring Cloud Gateway + RBAC: تأیید اعتبار و اعتبار جهانی

مقدمه

در معماری های مدرن میکروسرویس ، سیستم مدیریت کاربر یکی از مؤلفه های اصلی ، مسئول تأیید اعتبار کاربر و مدیریت مجوز است. با افزایش مقیاس سیستم ، مدیریت کارآمد مجوزهای کاربر و اطمینان از امنیت سیستم به یک چالش مهم تبدیل شده است. یک سیستم مدیریت کاربر مبتنی بر Spring Cloud Gateway و RBAC (کنترل دسترسی مبتنی بر نقش) می تواند به طور مؤثر به این مسئله بپردازد. در این مقاله نحوه اجرای احراز هویت مجوز و اعتبار سنجی جهانی با استفاده از Spring Cloud Gateway و نحوه ساخت یک سیستم مدیریت ایمن کاربر با ادغام مدل RBAC معرفی خواهد شد.


1. مقدمه ای برای بهار دروازه بهار

Spring Cloud Gateway یک دروازه API در اکوسیستم Cloud Spring است که به گونه ای طراحی شده است که روشی ساده و مؤثر برای مسیریابی درخواست ها ، انجام احراز هویت و اجرای تعادل بار برای معماری های میکروسرویس ارائه شده است. ساخته شده در بالای Spring 6 و Spring Boot 3 ، از دست زدن به درخواست غیر مسدود کننده ناهمزمان پشتیبانی می کند ، و آن را برای سناریوهای با کنفرانس بالا مناسب می کند.

ویژگی های اصلی دروازه ابر بهار شامل موارد زیر است:

  • مسیریابی: درخواست ها بر اساس مسیر ، روش ، هدرها و سایر معیارها به میکروسرویسهای مختلف هدایت می شوند.
  • فیلتر: منطق را می توان قبل یا پس از رسیدن درخواست ها به سرویس هدف ، مانند اعتبار سنجی مجوز و درخواست ورود به سیستم اجرا کرد.
  • تعادل بار: یکپارچه با LoadBalancer Cloud Spring برای توزیع درخواست ها در خدمات.
  • قطع کننده مدار: همراه با Cloud Cloud Circuckreer برای ارائه مقاومت در برابر خدمات و مکانیسم های بازگشت.

2. مدل RBAC (کنترل دسترسی مبتنی بر نقش)

RBAC یک الگوی مدیریت مجوز گسترده است که مجوزها را با نقش ها مرتبط می کند و کاربران از طریق تکالیف نقش مجوز می گیرند. مفاهیم اصلی RBAC عبارتند از:

  • کاربر: کاربر نهایی سیستم ، که می تواند یک فرد یا یک برنامه باشد.
  • نقش: مجموعه ای از مجوزهایی که کاربران هنگام اختصاص دادن به آنها به ارث می برند.
  • اجازه: توانایی انجام اقدامات خاص در مورد منابع سیستم ، مانند “خواندن” ، “نوشتن” یا “حذف”.

مزایای RBAC شامل موارد زیر است:

  • انعطاف پذیری: مجوزها را می توان با اختصاص یا ابطال نقش ها به راحتی مدیریت کرد.
  • حفظ قابلیت: متمرکز کردن مدیریت مجوز در سطح نقش ، پیچیدگی مستقیم مدیریت مجوزهای کاربر را کاهش می دهد.
  • امنیت: نقش های سلسله مراتبی و ارث اجازه امنیت سیستم را تقویت می کند.

3. احراز هویت مجوز و اعتبار جهانی با دروازه ابر بهار

در معماری های میکروسرویس ، دروازه API به عنوان نقطه ورود به کلیه درخواست های خارجی عمل می کند. بنابراین ، مناسب است که احراز هویت مجوز و منطق اعتبار سنجی جهانی را در سطح دروازه قرار دهید. مکانیسم فیلتر قدرتمند بهار Cloud Gateway اجازه می دهد تا قبل از رسیدن درخواست ها به سرویس هدف ، اعتبار مجوز را مجاز کنید.

3.1 فرآیند احراز هویت مجوز

  1. ورود کاربر: کاربران نام کاربری و رمز عبور خود را از طریق رابط ورود به سیستم ارسال می کنند. پس از تأیید هویت کاربر ، سیستم JWT (JSON Web Token) تولید می کند و آن را به مشتری باز می گرداند.
  2. نشانه در درخواست ها: مشتری شامل JWT در درخواست های بعدی ، به طور معمول در Authorization هدر
  3. اعتبار سنجی توکن دروازه: پس از دریافت درخواست ، بهار Cloud Gateway ابتدا JWT را از طریق یک فیلتر جهانی سفارشی تأیید می کند. اگر توکن نامعتبر یا منقضی شده باشد ، دروازه خطای غیرمجاز 401 را برمی گرداند.
  4. اعتبار سنجی مجوز: پس از تأیید توکن ، دروازه بررسی می کند که آیا کاربر بر اساس نقش خود و مسیر درخواست شده مجوزهای لازم را دارد یا خیر. اگر اینگونه نباشد ، یک خطای ممنوعه 403 بازگردانده می شود.
  5. مسیریابی به خدمات هدفمند: در صورت عبور از اعتبار سنجی مجوز ، درخواست به میکروسرویس هدف هدایت می شود.

3.2 اجرای اعتبار جهانی

اعتبار سنجی جهانی در بهار Cloud Gateway از طریق یک عرف قابل اجرا است GlobalFilterبشر در اینجا یک مثال ساده از فیلتر اعتبار سنجی جهانی آورده شده است:

public class GlobalGatewayFilter implements GlobalFilter, Ordered {

    private final AuthProperties authProperties;
    private final JwtUtils jwtUtils;
    private final RedisUtils redisUtils;

    /**
     * Token Filter
     *
     * @param exchange exchange
     * @param chain    chain
     * @return Mono
     */
    @Override
    public Mono\u003cVoid\u003e filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        ServerHttpRequest request = exchange.getRequest();
        String token = getToken(request);

        DecodedJWT jwt;
        try {
            jwt = jwtUtils.verifyJwt(token);
        } catch (TokenExpiredException e) {
            return unauthorized(requestUrl, exchange.getResponse(), "token is expired.");
        } catch (JWTVerificationException e) {
            return unauthorized(requestUrl, exchange.getResponse(), "token verification failed.");
        }
        if (jwt == null) {
            return unauthorized(requestUrl, exchange.getResponse(), "token is not legal.");
        }

        if (!verifyAuthorization(jwt, requestUrl, request.getMethod())) {
            return unauthorized(requestUrl, exchange.getResponse(), "request access denied, may be unauthorized.");
        }

        // Set username in request header
        ServerHttpRequest newRequest = request.mutate()
                .header("X-Forwarded-For", newHeader)
                .header(SystemConstant.HEADER_AUTHORIZATION, "")
                .header(AuthConstants.USERNAME, username)
                .header(AuthConstants.AUTH_WAREHOUSE, "").build();
        return chain.filter(exchange.mutate().request(newRequest).build());
    }
    }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال ، AuthFilter ابتدا JWT را از عنوان درخواست بازیابی می کند و صحت آن را تأیید می کند. اگر نشانه نامعتبر باشد ، خطای 401 بازگردانده می شود. در صورت اعتبار ، فیلتر نقش کاربر را از نشانه استخراج می کند و بررسی می کند که آیا کاربر اجازه دسترسی به منبع درخواست شده را بر اساس مسیر درخواست دارد یا خیر. اگر مجوز رد شود ، خطای 403 بازگردانده می شود. اگر اعتبار سنجی بگذرد ، درخواست از زنجیره فیلتر ادامه می یابد.

کد اعتبار سنجی اجازه دسترسی به منابع:

public boolean verifyAuthorization(DecodedJWT jwt, String requestUrl, HttpMethod httpMethod) throws JWTVerificationException {
    Claim authorities = jwt.getClaim(AuthConstants.AUTH_MENUS);
    if (null == authorities) {
        return false;
    }
    List\u003cString\u003e authoritySet = authorities.asList(String.class);
    if (CollectionUtils.isEmpty(authoritySet)) {
        return false;
    }
    if (authoritySet.contains(AuthConstants.SUPPER_PERMISSION)) {
        return true;
    }
    String url = httpMethod.name().toLowerCase() + ":" + requestUrl;
    return authoritySet.stream().anyMatch(url::startsWith);
    }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

\ u003e در اینجا ، ادعای مقامات = jwt.getClaim (authconstants.auth_menus)، ما مجوزهای کاربر را در نشانه ذخیره می کنیم و سپس آنها را از نشانه بازیابی می کنیم. با این حال ، اگر مجوزهای کاربر گسترده باشد ، ممکن است این نشان خیلی بزرگ و عملکرد تأثیر داشته باشد. در چنین مواردی ، روشهای جایگزین باید در نظر گرفته شود ، مانند پرس و جو مجوزهای کاربر از سرویس مدیریت کاربر و آنها را ذخیره می کند. به این ترتیب ، نشانه فقط نیاز به ذخیره اطلاعات نقش کاربر دارد.

3.3 مدیریت مجوز RBAC

در مدل RBAC ، مدیریت مجوز به طور معمول از طریق یک بانک اطلاعاتی اجرا می شود. در اینجا یک طرح ساده پایگاه داده برای مدیریت مجوز وجود دارد:

  • جدول کاربر: اطلاعات اصلی کاربر را ذخیره می کند.
  • جدول نقش: اطلاعات نقش اساسی را ذخیره می کند.
  • جدول مجوز: اطلاعات مجوز اولیه را ذخیره می کند.
  • میز userrole: کاربران را با نقش ها مرتبط می کند.
  • جدول نقش: نقش ها را با مجوزها مرتبط می کند.

با استفاده از این جداول ، می توان مدیریت انعطاف پذیر کاربران ، نقش ها و مجوزها را بدست آورد. در حین اعتبارسنجی مجوز ، سیستم مجوزهای مرتبط با نقش کاربر را پرس و جو می کند و تعیین می کند که آیا دسترسی به منبع درخواست شده مجاز است یا خیر.

3.4 ورود کاربر

کد ورود کاربر:

@PostMapping("/signin")
public AuthModel authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
    Authentication authentication = authenticationManager
            .authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));

    TokenResponse tokenResponse = jwtUtils.generateJwtCookie(authorities, userDetails.getUsername(), authWarehouseCodes,
            userDetails.getUser().getTenantName());
    UserModel userModel = UserModel.builder().id(userDetails.getUser().getId())
            .username(userDetails.getUsername()).icon(userDetails.getUser().getAvatar()).build();
    return AuthModel.builder().token(tokenResponse.getToken()).user(userModel).expiresIn(tokenResponse.getExpiresIn()).build();
    }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کد تولید توکن:

public String generateToken(List<String> authorityList, String userName, Set<String> authWarehouseCodes, String tenantName) {
    Algorithm algorithm = Algorithm.HMAC256(tokenSecret);
    return JWT.create()
            .withClaim(AuthConstants.USERNAME, userName)
            .withClaim(AUTH_MENUS, authorityList)
            .withExpiresAt(new Date(System.currentTimeMillis() + tokenExpiration * 1000L))
            .sign(algorithm);
            }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


4. نتیجه گیری

یک سیستم مدیریت کاربر مبتنی بر Spring Cloud Gateway و RBAC می تواند به طور موثری تأیید اعتبار و اعتبار جهانی را اجرا کند. با قرار دادن منطق اعتبار سنجی مجوز در سطح دروازه ، می توان کد تکراری در هر میکروسرویس را کاهش داد و باعث افزایش امنیت سیستم و قابلیت حفظ آن شد. ادغام مدل RBAC باعث می شود مدیریت مجوز انعطاف پذیرتر و کنترل شود. در پروژه های عملی ، این راه حل می تواند برای برآورده کردن الزامات پیچیده مدیریت مجوز بیشتر گسترش یافته و بهینه شود.

از طریق این مقاله ، ما امیدواریم که خوانندگان بتوانند نحوه ایجاد یک سیستم مدیریت ایمن کاربر را با استفاده از Spring Cloud Gateway و RBAC درک کنند و این فناوری ها را در پروژه های خود به کار گیرند.

کد در GitHub موجود است: Github – Jingsewu/Open -Wes

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا