Olá Pessoal,
Estou trabalhando em uma aplicação web, e ja configurei o spring security no seu modo padrão.. funcionando normal.. porem configurar todas as urls com as devidas roles direto do arquivo applicationcontext.xml está sendo muito trabalhoso pois o sistema terá muitas rolas.. mais de 30 telas.. preciso de uma coisa mais dinamica e que tambem não fique o xml de configuração do spring tão carregado.
As tecnologias que estou utilizando no projeto é JSF2.1/PRIMEFACES3.4.2+CDI+EJB3.1+GLASSFISH3.1.2 +POSTGREESQL+SPRING SECURITY 3.1.3
Após algumas pesquisas na documentação e vi que seja para armazenar em um arquivo properties ou banco de dados eu preciso criar um classe/filtro que implemente FilterInvocationSecurityMetadataSource, depois de cria-la.. preciso configurar no applicationcontext.xml.. foi onde me enganchei..
Li varios tutoriais na internet.. li a documentação inteira do spring security.. porem não consigo achar informação que me passe uma forma exata de configurar.. pois a cada local que encontro as pessoas fazem de uma forma diferente... tentei mas não consegui rodar..
Tem um parte na documentação do spring que fala isso..
Note that you can't replace filters which are created by the use of theelement itself - SecurityContextPersistenceFilter, ExceptionTranslationFilter or FilterSecurityInterceptor.
e o FilterSecurityInterceptor é exatamente o que eu estou precisando e vi que varias pessoas já fizeram...
Essa parte da documentação desdus-se que as configurações que estão dentro do elemento
Como eu ja tentei e não consegui.. alguem poderia me informar com base no meu applicationcontext.xml e web.xml atuais que funcionam hoje na minha aplicação, o que eu preciso mudar nesse codigo ? o que precisa acrescentar de fato ? pois ja segui varios tutoriais e não conseguir fazer funcionar.. porisso prefiro nem debater o que eu ja tentei.. gostaria de parte do que tenho funcionando.
Meu web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
<!-- server é o padrão -->
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>/pages/sistema/index.jsf</welcome-file>
</welcome-file-list>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>south-street</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
<!--SPRING SECURITY-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!--/ESSE FILTRO É QUE CONTROLAR O MAXIMO DE USUARIO LOGADO POR SESSAO-->
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
<!--FECHA SPRING SECURITY-->
</web-app>
Meu applicationcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<b:beans
xmlns:b="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<sec:http access-denied-page="/pages/public/acessoNegado.jsf" use-expressions="true">
<sec:form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?erro=true"/>
<sec:intercept-url pattern="/login.jsf" access="isAnonymous()" />
<sec:intercept-url pattern="/pages/public/**" access="isAnonymous()" />
<sec:intercept-url pattern="/template/sistema/**" access="isAnonymous()" />
<sec:intercept-url pattern="/pages/sistema/index.jsf" access="hasRole('Administrador')" />
<sec:intercept-url pattern="/pages/sistema/cadastrosgerais/cidade.jsf" access="hasRole('Chico')" />
<sec:intercept-url pattern="/pages/sistema/cadastrosgerais/cliente.jsf" access="hasRole('Administrador')" />
<sec:logout delete-cookies="JSESSIONID"/>
<sec:session-management invalid-session-url="/pages/public/erroSessao.jsf">
<sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</sec:session-management>
</sec:http>
<sec:authentication-manager>
<sec:authentication-provider>
<sec:password-encoder hash="sha-256" />
<sec:jdbc-user-service data-source-ref="dataSource" role-prefix=""
users-by-username-query="SELECT username, password, enable FROM usuario WHERE username=?"
authorities-by-username-query="SELECT username, authority FROM usuario_role WHERE username=?"/>
</sec:authentication-provider>
</sec:authentication-manager>
<b:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<b:property name="url" value="jdbc:postgresql://localhost:5432/MasterappBD" />
<b:property name="driverClassName" value="org.postgresql.Driver"/>
<b:property name="username" value="postgres" />
<b:property name="password" value="d22m05343Pwsakd" />
</b:bean>
</b:beans>
Se alguem puder me ajudar eu agradeço !!