Принятый ответ от Кевина Боуэрсокса работает, но мне не нравилось иметь материал T (full.qualified.path), поэтому я продолжал смотреть. Я начал с создания пользовательского метода защиты с помощью ответа от Джеймса Уоткинса здесь:
How to create custom methods for use in spring security expression language annotations
Однако вместо строки, я использовал мой класс 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 (fully.qualified.path) для @mySecurityService и дополнительные одинарные кавычки.
Не уверен, что это лучше, но вот оно. Поскольку ничто из этого не собирается проверять значения во время компиляции, мой следующий шаг - сделать обработчик аннотации.
Я также должен отдать krosenvold за указание, что весной может автоматически преобразовать в перечислении: https://stackoverflow.com/a/516899/618881
Прекрасно работает, спасибо! – RobEarl
@RobEarl Awesome Glad Я мог бы помочь. Я тоже кое-что узнал. –
Работает, но это все еще интерпретированная строка, поэтому она не будет «замечена» Eclipse, когда вы рефакторинг, например. имя, я думаю. – yglodt