Как использовать элегантные права администратора Защитника?

Java

Что такое управление правами

Управление разрешениями бессознательно проникло во все уголки нашей жизни, такие как турникеты на станциях метро, ​​плата за проезд на скоростных автомагистралях, рычаги на парковках и так далее.

Как разработчик, слово «разрешение» имеет более глубокое значение для нашего образа, независимо от системы, оно более или менее связано с управлением разрешениями! Какие? Ваша система не имеет ничего общего с разрешениями... ну, они должны быть у ваших разрешений на извлечение кода! Если вы еще этого не сделали, процесс входа в 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Только начал, если вам интересно, вы можете интегрировать его в свою среду разработки и попробовать.Адрес проекта следующий

Портал Защитника

Официальный также предоставляет простую документацию по использованию

китайский документ

English Document

Если вы чувствуете себя хорошо и хотите внести свой вклад

Как внести свой вклад