Сравнивая две строки, обе с регулярным выражением - PullRequest
0 голосов
/ 16 февраля 2019

Я внедряю систему безопасности в своем приложении, и у меня возникают некоторые проблемы, чтобы проверить, есть ли у пользователя x разрешение y.

Что ж, давайте контекстуализировать: Например, у моего приложения есть этиразрешения:

  • cmd.a
  • cmd.b
  • api.a
  • api.b

Администраторам доступны следующие разрешения: *.a (* означает все, поэтому cmd.a и api.a), а обычные пользователи имеют *.b (cmd.b и api.b).

Так что я должен сравнить, если у пользователя есть cmd.a.Ну как мне сравнить *.a с cmd.a?А как насчет сравнения *.a с cmd.* (cmd.a, cmd.b) (должно быть ложным, потому что *.a включает только cmd.a и api.a)?

Честно говоря, нетне знаю, с чего начать, так как я не буду знать существующие разрешения во время выполнения (cmd.a, cmd.b, api.a, api.b), у меня просто есть разрешения, которые есть у пользователя (например, 1046 *) иразрешение (может появиться *) для сравнения (например, cmd.* или cmd.foo и т. д.).

Я действительно не знаю, правильно ли я объяснил, чего я хочу.Как я могу сравнить эти выражения регулярных выражений?

1 Ответ

0 голосов
/ 16 февраля 2019

Это не регулярные выражения.Что-то вроде cmd\\..* будет регулярным выражением (которое будет соответствовать cmd.a и не будет соответствовать api.a).

Сначала напишите этот метод:

public static boolean matches(String permission, String config) {
    // you write it!
}

, который действует следующим образом:

public static void test() {
    assertTrue(matches("cmd.a", "cmd.*"));
    assertFalse(matches("cmd.a", "api.*"));
    assertTrue(matches("cmd.b", "*.b"));
    assertFalse(matches("cmd.b", "*.a"));
}

как только вы это сделаете, все остальное должно быть простым.Я не думаю, что вы должны использовать регулярные выражения для реализации совпадений, но вы можете, если вы действительно хотите.Убедитесь, что вы используете функцию Pattern.quote, если вы делаете, хотя!

...