Mam następujący problem. Zabezpieczać aplikację z użyciem Spring
Security i chciałem użyć jego tagów do ograniczania funkcjonalności w
widokach. Niestety tagi <security:authorize
ifAnyGranted="ROLE_USER"> .... </security:authorize> nie są wcale
interpretowane, są zrzucane do wynikowego HTML tak jak zostały
wpisane.
Mam podpięte biblioteki w pom.xml:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>2.0.4</version>
</dependency>
reszta springa jest podpięta w includowanych projektach.
Moja konfiguracja sping security:
<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-2.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<http auto-config="true">
<intercept-url pattern="/app/login/**"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/app/m**" access="ROLE_USER" />
<form-login default-target-url="/app/menu" login-page="/app/login"
always-use-default-target="false"
authentication-failure-url="/app/login?authfailed=true"/>
<concurrent-session-control max-sessions="1" exception-if-maximum-
exceeded="true" />
</http>
<beans:bean id="daoAuthenticationProvider"
class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="userDetailsService" /
>
<custom-authentication-provider />
</beans:bean>
<beans:bean id="userDetailsService"
class="pl.app.UserDetailsServiceImpl" />
</beans:beans>
Przykładowy widok:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:rich="http://richfaces.org/rich"
xmlns:security="http://www.springframework.org/security/tags">
<ui:composition template="/WEB-INF/layout/template.xhtml">
<ui:define name="body">
<security:authorize ifAnyGranted="ROLE_USER">
<h:commandButton action="options" value="Opcje" />
</security:authorize>
</ui:define>
</ui:composition>
</html>
Myślałem, że to może być problem związany z wyłączoną obsługą
adnotacji:
<global-method-security secured-annotations="enabled">
</global-method-security>
Jednak po dodaniu tego dostaję wyjątek przy starcie jetty:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
Configuration problem: Cannot locate
'org.springframework.security.annotation.SecuredMethodDefinitionSource'
Offending resource: ServletContext resource [/WEB-INF/config/
applicationContext-security.xml]
at
org.springframework.beans.factory.parsing.FailFastProblemReporter.error
(FailFastProblemReporter.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.error
(ReaderContext.java:85)
at org.springframework.beans.factory.parsing.ReaderContext.error
(ReaderContext.java:72)
at
org.springframework.security.config.GlobalMethodSecurityBeanDefinitionParser.validatePresent
(GlobalMethodSecurityBeanDefinitionParser.java:47)
at
org.springframework.security.config.GlobalMethodSecurityBeanDefinitionParser.registerAnnotationBasedMethodDefinitionSources
(GlobalMethodSecurityBeanDefinitionParser.java:103)
at
org.springframework.security.config.GlobalMethodSecurityBeanDefinitionParser.parse
(GlobalMethodSecurityBeanDefinitionParser.java:56)
at
org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse
(NamespaceHandlerSupport.java:69)
at
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement
(BeanDefinitionParserDelegate.java:1297)
at
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement
(BeanDefinitionParserDelegate.java:1287)
at
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions
(DefaultBeanDefinitionDocumentReader.java:135)
at
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions
(DefaultBeanDefinitionDocumentReader.java:92)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions
(XmlBeanDefinitionReader.java:507)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions
(XmlBeanDefinitionReader.java:398)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions
(XmlBeanDefinitionReader.java:342)
...
W projekcie używam:
JSF + Spring WebFlow, Richfaces ,Spring 2.5.6
Będę wdzięczny za pomoc!
Pozdrawiam
Łukasz
nikt nic nie wie ?:(
Siędzę nad tym od dwóch dni :-/
tak trochďż˝ w ciemno
jeste� pewien, �e u�ywasz biblioteki tag�w kompatybilnych z facelets?
Pozdrowienia
Tomek
dokładnie to !
Nie są kompatybilne. Dzięki za sugestię !
Jeśli ktoś kiedyś by szukał rozwiązania to ta biblioteka pomoże:
http://www.dominikdorn.com/facelets/ lub http://code.google.com/p/spring-security-facelets-taglib/
wystarczy podpiąć pod projekt i zmienić namespace na
http://www.springframework.org/security/facelets/tags
Same tagi trochę się różnią, przykład użycia:
<security:ifAnyGranted roles="ROLE_USER"> .... </
security:ifAnyGranted>
Jeszcze raz dziękuję za sugestię ;)