Spring Security - Carregar urls e roles de um arquivo propertie ou bando de dados?

4 respostas
G

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 the element 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 não pode ser sobrescritas se utilizadas

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 !!

4 Respostas

dsystem

Glauter, boa tarde.

Você conseguiu resolver essa situação?? Estou passando pelo mesmo problema e não encontro uma solução.

G

dsystem:
Glauter, boa tarde.

Você conseguiu resolver essa situação?? Estou passando pelo mesmo problema e não encontro uma solução.

Não consegui. Criei uma solução própria seguindo o mesmo conceito do spring e que por sinal ficou bem melhor e customizavel.

Pesquisa sobre web filters.

jaboot

Glauter:
Não consegui. Criei uma solução própria seguindo o mesmo conceito do spring e que por sinal ficou bem melhor e customizavel.
Pesquisa sobre web filters.

Glauter,

Os filtros que você se refere são estes, correto? O que eu queria saber mesmo é a sua arquitetura, trocar uma ideia sobre como você fez.

Eu segui meio que o modelo do Spring também, mas estou gravando as Roles no banco. Eu criei inicialmente 5 Roles, que peguei em um documento do Spring Security. A hierarquia delas é essa (14.4):

ROLE_ADMIN > ROLE_STAFF
ROLE_STAFF > ROLE_USER
ROLE_USER > ROLE_GUEST

Só que eu não encontrei o nome dessas Roles em lugar algum do Spring. Pensei a princípio que seriam parte de um Enum ou algo assim, mas não encontrei.

Eu faço o login -> acertando o user+pass eu insiro no meu AuthenticationToken uma só GrantedAuthority, que pego também no banco (que é essa tabela).
Vocês fazem de alguma forma diferente?

G

Me manda uma mensagem privada que eu respondo com o meu skype e lhe mostro a minha solução.

Criado 27 de fevereiro de 2013
Ultima resposta 22 de jul. de 2013
Respostas 4
Participantes 3