Пружина безопасности 3.1 + JSF 2.0.проблема с аннотирующими методами в ManagedBeans? - PullRequest
2 голосов
/ 20 сентября 2011

Hy. То, что я пытаюсь сделать, - это интегрировать безопасность Spring с приложением Jsf + spring IOC + hibernate. Мне удалось настроить страницу входа и отфильтровать некоторые другие страницы. Пока все хорошо, но когда я попытался Поместив аннотацию @Secured или @PreAuthorize на методы внутри managedBeans (внутри аннотации Дао работают), я понял, что они абсолютно ничего не делают. Я прочитал, что мне нужны прокси класса FORCE. Spring использует aop на основе прокси, управляемый бин реализует интерфейс, поэтому вместо прокси класса используется динамический прокси jdk. Итак, я сделал это в моем конфигурационном файле:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"**    
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd         
http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

<aop:aspectj-autoproxy proxy-target-class="true"/>
 //the rest of the beans
 </beans>

ApplicationContext-security Xml выглядит так:

  <?xml version="1.0" encoding="UTF-8"?>

 <!-- - Sample namespace-based configuration - - $Id: applicationContext-security.xml 
3019 2008-05-01 17:51:48Z luke_t $ -->

 <beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<global-method-security secured-annotations="enabled"  jsr250-annotations="enabled"/>

<http pattern="/css/**" security="none" />
<http pattern="/pages/login.xhtml" security="none" />

<http auto-config='false'>
    <intercept-url pattern="/pages/customer/**" access='ROLE_SITE_ADMIN' />
    <intercept-url pattern="/pages/department/overhead*" access='ROLE_SITE_ADMIN' />
    <intercept-url pattern="/**"
        access='ROLE_SITE_ADMIN,ROLE_PROJECT_MANAGER,ROLE_DEPARTMENT_MANAGER,ROLE_ACCOUNTING' />
    <form-login login-page="/pages/login.xhtml"
        default-target-url='/pages/reports.xhtml' always-use-default-target='true'
        authentication-failure-handler-ref="userLoginService" />
    <logout invalidate-session="true" logout-success-url="/pages/login.xhtml"/>
</http>

<authentication-manager>
    <authentication-provider user-service-ref='userLoginService'>
        <password-encoder hash="md5" />
    </authentication-provider>
</authentication-manager>

<beans:bean id="userLoginService" class="com.evozon.demo.bean.SecureLoginService">
    <beans:property name="defaultFailureUrl" value="/pages/login.xhtml" />
    <beans:property name="userDao" ref="userDao" />
    <beans:property name="loginReportDao" ref="loginReportDao" />
</beans:bean>
 </beans:beans>

Может кто-нибудь сказать мне, почему аннотации не работают внутри управляемого компонента, и как решить проблему? например:

    @PreAuthorize("ROLE_PROJECT_MANAGER")
public void aproveVacation(Vacation vacation) {...}

1010 * ТНХ *

1 Ответ

0 голосов
/ 23 сентября 2011

Проблема была решена. Решением является преобразование управляемых bean-компонентов в Spring-bean-компоненты.Вот как:
web.xml не нуждается в слушателе jsf, только в sprin:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

В контексте приложения эта конфигурация должна работать сначала:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd         
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">


<context:component-scan base-package="com.company.demo.bean" />
<context:annotation-config />
<aop:config proxy-target-class="true" />
//other configs
</beans>     

Обратите внимание, что первые два должны определить базовый пакет для пружинных компонентов (для Компонентов), и что компоненты должны быть аннотированы. Третий конфиг нужен для принудительной настройки прокси-класса класса, , вот почему вам нужен .
Хорошо. Как только мы узнаем, что мы изменили аннотации с jsf managedBeans на компоненты Spring:

@ManagedBean
@SessionScoped
public class UserLoginBean {

@ManagedProperty(name = "userDao", value = "#{userDao}")
private UserDao userDao; 
}   

на:

@Component
@Scope("session")
@Qualifier("userLoginBean")
public class UserLoginBean  {

@Autowired
private UserDao userDao;
}     

Вот и все. Если у вас уже есть эта конфигурацияи не работает, вы должны установить <aop:config proxy-target-class="true" /> в вашем applicationContext.xml.

...