Принятый ответ от Кевина Бауэрсокса работает, но мне не нравился материал T (full.qualified.path), поэтому я продолжал искать. Я начал с создания пользовательского метода безопасности, используя ответ Джеймса Уоткинса здесь:
Как создать собственные методы для использования в аннотациях языка выражений безопасности spring
Однако вместо String я использовал свой класс enums.Permissions в качестве типа параметра:
@Component
public class MySecurityService {
public boolean hasPermission(enums.Permissions permission) {
...do some work here...
return true;
}
}
Теперь интересная часть заключается в том, что когда я вызываю hasPermission из аннотации, мне не нужно вводить весь путь, но я должен заключать его в одинарные кавычки:
@PreAuthorize("@mySecurityService.hasPermission('SOME_ROLE_NAME')")
Поскольку метод hasPermission ожидает Enum, он автоматически найдет значение Enum с этим именем. Если он не найдет его, вы получите исключение:
org.springframework.expression.spel.SpelEvaluationException: Type conversion problem, cannot convert from java.lang.String to enums.Permissions
Вы можете переименовать hasPermission в hasRole, и в этом случае единственный компромисс заключается в том, что вы обмениваете T(full.qualified.path) на @mySecurityService и дополнительные одинарные кавычки.
Не уверен, что он лучше, но он есть. Так как ничто из этого в любом случае не будет проверять значения во время компиляции, моим следующим шагом будет создание процессора аннотаций.
Я также должен отдать должное krosenvold за то, что он указал, что spring может автоматически преобразовываться в перечисление: https://stackoverflow.com/a/516899/618881
person
Henry
schedule
17.07.2013