Przyjęta odpowiedź od Kevina Bowersoxa działa, ale nie podobało mi się posiadanie rzeczy T (w pełni kwalifikowanych), więc wciąż szukałem. Zacząłem tworząc niestandardową metodę zabezpieczeń przy użyciu odpowiedź od James Watkins tutaj:
How to create custom methods for use in spring security expression language annotations
Jednak zamiast String, kiedyś moją klasę enums.Permissions jako typ parametru:
@Component
public class MySecurityService {
public boolean hasPermission(enums.Permissions permission) {
...do some work here...
return true;
}
}
teraz miłe jest to, że kiedy ja nazywam hasPermission z adnotacją, że nie trzeba mieć, aby wpisać całą ścieżkę, ale trzeba ją ująć w apostrofy:
@PreAuthorize("@mySecurityService.hasPermission('SOME_ROLE_NAME')")
Ponieważ metoda hasPermission oczekuje wyliczenia, automatycznie znajdzie wartość wyliczenia o tej nazwie. Jeśli nie go znaleźć dostaniesz wyjątek:
org.springframework.expression.spel.SpelEvaluationException: Type conversion problem, cannot convert from java.lang.String to enums.Permissions
Można zmienić nazwę hasPermission do hasRole, w którym to przypadku jedyny kompromis jest to, że jesteś handlowych (T) dla fully.qualified.path @mySecurityService i dodatkowe pojedyncze cudzysłowy.
Nie jestem pewien, czy jest lepszy, ale jest. Ponieważ żadna z nich i tak nie zweryfikuje wartości podczas kompilacji, moim następnym krokiem jest stworzenie procesora adnotacji.
Mam też dać kredyt krosenvold za wskazanie, że wiosna może automatycznie konwertować do wyliczenia: https://stackoverflow.com/a/516899/618881
Działa świetnie, dziękuję! – RobEarl
@RobEarl Awesome Glad, że mogę pomóc. Też się też czegoś nauczyłem. –
Działa, ale wciąż jest interpretowanym ciągiem znaków, więc nie będzie "widziany" przez Eclipse podczas refaktoryzacji, np. nazwa chyba. – yglodt