2012-05-23 3 views
2

Я хотел бы создать пользовательскую аннотацию, чтобы украсить методы, которые ограничивали бы доступ к вызовам методов.Авторизация управляемого управляемого компонента с использованием пользовательских аннотаций java в JSF 2.0

Моя аннотация определена ниже:

@Inherited 
@Documented 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Restrict { 
    public enum RoleType {All, ROLE_A, ROLE_B, ROLE_C, ROLE_D} 
    String roleLevel(); 
    RoleType roleType(); 
} 

Затем с помощью аннотации, как в следующем. Аннотации получают два параметра, один из которых является обязательным минимальным типом roleType, а другой - минимальным требуемым уровнем.

@Restrict(roleType = RoleType.ALL, roleLevel="user") 
String deleteSomething() { 
    // delete intended whatever 
    return success; 
} 

Мой умысел, когда происходит любой вызов Управляемой методы Bean, который украшен этой аннотацию, как и в описанном выше способе «deleteSomething()», этот вызов будет перехвачен и параметры, установленный на метод по сравнению с зарегистрированными пользователями соответствующими значениями сеанса. Если значения роли сеанса зарегистрированных пользователей достаточно высоки, метод Managed Bean будет разрешен для вызова, иначе пользователь будет перенаправлен или отобразится соответствующее сообщение.

Мой вопрос в том, есть ли способ, которым я могу «зацепиться» за то, какие методы называются bing, а затем, через отражение, увидеть, есть ли аннотация @Restrict в методе и затем обрабатывать аннотацию. Я пробовал делать это в классе PhaseListener, но я не уверен, как узнать, что вызывается Managed Bean для выполнения рефлексии. Я читал о custome ElResolver, но я не уверен, что это все, что мне поможет. Я также попытался найти способ просто создать слушателя, который каким-то образом знает, когда был вызван метод, который был аннотирован с помощью @Restrict.

Environment Specifics: 

Tomcat 6.0.35 (considering upgrading to Tomcat 7.0.27) 
JSF version 2.1.7 
RichFaces 4.1.0 

Я просто ищу руководство и некоторые варианты, доступные мне. Спасибо всем, кто может мне помочь!

+0

По совпадению, кто-то другой задал тот же вопрос на этой неделе, и решение заключалось в использовании пользовательской реализации «ActionListener»: http://stackoverflow.com/questions/10660273/custom-annotation-jsf – BalusC

+0

@BalusC Спасибо BalusC за ваше время и быстрый ответ. Исправьте меня, если я ошибаюсь, но решение в вашей ссылке с помощью ActionListener обрабатывает выражения в атрибуте «действие»? Как обращаться с вызовами ajax. Кроме того, я не использую JaaS. Мы просто устанавливаем объект для сеанса для пользователя. Этот объект содержит информацию о разрешении, и мы используем фильтр для аутентификации. Нужно ли мне реализовать что-то вроде JaaS, чтобы сделать то, что я хочу работать? Мои знания об этих технологиях ограничены, поэтому любое руководство очень ценится! – Mickelback

+0

Он также вызывается для вызовов ajax. Просто проверьте, является ли действие, подлежащее вызову, действием или слушателем действия. JaaS не требуется. Дело в том, что вы можете использовать «ActionListener» для этого. – BalusC

ответ

2

Вы можете достичь этого, выполнив заказ ActionListener, который был зарегистрирован как глобальный <action-listener> в faces-config.xml.

По совпадению, кто-то другой спросил и ответил на тот же вопрос на этой неделе: Custom Annotation JSF. Обратите внимание, что JAAS не требуется для конкретной цели, просто возьмите User из сеанса на FacesContext обычным способом.

+0

Спасибо BalusC !!! – Mickelback