Что такое управление правами
Управление разрешениями бессознательно проникло во все уголки нашей жизни, такие как турникеты на станциях метро, плата за проезд на скоростных автомагистралях, рычаги на парковках и так далее.
Как разработчик, слово «разрешение» имеет более глубокое значение для нашего образа, независимо от системы, оно более или менее связано с управлением разрешениями! Какие? Ваша система не имеет ничего общего с разрешениями... ну, они должны быть у ваших разрешений на извлечение кода! Если вы еще этого не сделали, процесс входа в Nuggets, просмотра этой статьи и нажатия лайков требует нескольких проверок разрешений. Хорошо, вернемся к сути, вот картинка, чтобы просто показать, как выглядят разрешения веб-системы:
После прочтения это кажется очень простым, да, управление разрешениями не сложно, нам нужно толькочекЭта связь может быть развита, и есть много способов ее реализации:
Вариант 1: Инкапсуляция компонентов
Мы можем разделить весь процесс проверки разрешений на компоненты, например, имя компонентаAuthComponent
, а затем в начале методов, соответствующих всем интерфейсам, требующим проверки разрешений, вызовитеAuthComponent
изverify
Метод проверяется, и в соответствии с результатом выполняются различные бизнес-процессы!
- Преимущества: кажется, что он достигает основной цели, и он очень гибкий~
- Недостатки: избыточность кода, низкая связанность, высокая связанность, сложность в обслуживании.
Вариант 2: Общая обработка
На основе Схемы 1 делаем некоторые модификации, такие как использованиеAOP
Делаем фасет интерфейса, который надо верифицировать, используем до выполнения методаAuthComponent
Просто проверьте это, чтобы наш код более удобен для обслуживания!
- Достоинства: компенсируют недостатки схемы один.
- Недостатки: слишком общий, трудно совместим со всеми ситуациями, не гибкий.
Вариант 3: пользовательская аннотация
Совмещаем схему 1 и схему 2. Одна гибкая, а другая общая.Настраиваем программу под названием@Auth
Аннотация, и ей нужно передать параметр, здесь мы определяем диаметр как класс перечисленияLevel
Простая структура выглядит следующим образом:
public enum Level { LOGIN, ADMIN }
Затем мы определяем аспект аннотации, который тангенциально переносит@Auth
метод, в соответствии с содержимым значения value перед выполнением метода, то естьLevel
Это значение можно использовать для управления различными разрешениями.
- Преимущества: гибкий и управляемый, универсальность в порядке.
- Недостатки: отсутствие компонентизации, фрагментированная структура, сложность повторного использования и необходимость формулировать несколько аспектов для различных сценариев, что не элегантно!
Вариант 4. Используйте фреймворк
Это самый простой метод, такой как отличный открытый исходный кодshiro
,spring-Security
и т. д. могут удовлетворить наши потребности, разница только в весе рамы и способе ее использования!
Как более элегантно управлять разрешениями
Предположительно, многие студенты используют четвертую схему, а многие мелкие партнеры используют третью схему Для схем один и два с очевидными недостатками их следует использовать очень мало.
Что нам делать, если нашему сервису не нужна такая тяжелая структура управления разрешениями для решения проблемы с разрешениями, и мы не хотим реализовывать ее с неэлегантными пользовательскими аннотациями?
попробуйDefender
что такое защитник
defender
полное объятиеspring-boot
Легкая, очень гибкая и высокодоступная структура разрешений. Если нам нужно более изящно добавить управление разрешениями к службам в повседневной жизни, тоdefender
В самый раз!
Это может избавить нас от многократного написания пользовательских аннотаций и аспектов, и достаточно вызвать простой API для гибкого указания различных режимов защиты сети.
почему элегантный
defender
Предоставьте небольшой и гибкий API, чтобы сформулировать нужную вам сеть фильтрации разрешений, и предоставьте различные режимы защиты.Мы можем быстро завершить управление разрешениями, вызвав простой API для создания валидатора различных режимов:
@Configuration
@EnableDefender("* org.nico.trap.controller..*.*(..)")
public class DefenderTestConfig {
@Bean
public Defender init(){
return Defender.getInstance()
.registry(Guarder.builder(GuarderType.URI)
.pattern("POST /user/*")
.preventer(caller -> {
return caller.getRequest().getHeader("token") == null
? Result.pass() : Result.notpass("error");
}))
.ready();
}
}
Функция вышеуказанного кода состоит в том, чтобы соответствовать запросуPOST
тип, а URI имеет префикс/user/
Все интерфейсы авторизованы для управления.
В качестве альтернативы мы можем использоватьlambda
Просто завершите логику проверки разрешений или используйте анонимные классы для реализации сложной логики проверки:
Guarder.builder(GuarderType.ANNOTATION)
.pattern("org.nico.trap.controller")
.preventer(new AbstractPreventer() {
@Autowired
private AuthComponent authComponent;
@Override
public Result detection(Caller caller) {
String identity = caller.getAccess().value();
if(! identity.equals(AuthConst.VISITOR)) {
UserBo user = authComponent.getUser();
if(user != null) {
if(identity.equals(AuthConst.ADMIN)){
if(user.getRuleType() == null) {
return Result.notpass(new ResponseVo<>(ResponseCode.ERROR_ON_USER_IDENTITY_MISMATCH));
}
}
}else {
return Result.notpass(new ResponseVo<>(ResponseCode.ERROR_ON_LOGIN_INVALID));
}
}
return Result.pass();
}
})
вGuarderType.URI
иGuarderType.ANNOTATION
Представляют режим сопоставления URI ANT и режим аннотации соответственно, последний является реализацией схемы три,defender
Предоставляет простой и элегантный API для интеграции различных режимов методов проверки разрешений.
по сравнению сshiro
,spring-security
,defender
Он более легкий и гибкий, поскольку не обеспечивает более конкретной реализации управления рядом разрешений, но открывает разработчикам интерфейс для реализации проверки, а общий размер кода не превышает21k
, очевидно, для упрощенного управления разрешениями,defender
более подходящий!
Различный портал
defender
Только начал, если вам интересно, вы можете интегрировать его в свою среду разработки и попробовать.Адрес проекта следующий
Официальный также предоставляет простую документацию по использованию
Если вы чувствуете себя хорошо и хотите внести свой вклад