Dúvida sobre Spring Security

7 respostas
F

Bom Tarde,

Galera, to com muitos problemas ao tentar usar Spring Security,
É a primeira vez que tento usar,

fiz as seguintes configurações no web.xml e no applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>AppTeste</display-name>
	<welcome-file-list>
		<welcome-file>index.jsf</welcome-file>
	</welcome-file-list>
	<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>
	</servlet-mapping>


<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>

<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>classpath*:/applicationContext.xml</param-value>  
</context-param>  

</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
                        http://www.springframework.org/schema/security
                         http://www.springframework.org/schema/security/spring-security-3.0.xsd">

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

<http auto-config="true" servlet-api-provision="true">
<form-login login-page="/login.jsf"/>
	<intercept-url pattern="/index.jsf" access="hasRole('ROLE_USER')"/>
</http>

	<authentication-manager>
		<authentication-provider>
			<jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="SELECT username, password, 'false' as enable FROM users WHERE username=?"
				authorities-by-username-query="SELECT username, authority FROM users WHERE username=?" />
		</authentication-provider>
	</authentication-manager>

	<beans:bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="url"
			value="jdbc:mysql://localhost:3306/teste" />
		<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<beans:property name="username" value="root" />
		<beans:property name="password" value="mysql" />
	</beans:bean>

</beans:beans>

Criei um diretório admin com um index.xhtml dentro dele no web content e um index.xhtml fora
Teoricamente, ao tentar acessar a página index do admin, ele deveria me jogar para o login que tbm criei, certo?

Falta algum tipo de configuração?
Mal pela pergunta “tosca”, mas não acho nada que me ajude a entender =D

7 Respostas

L

Você não tinha que colocar no intercept-url as páginas que o spring security vai bloquear não ?

/login.jsf não era para ser bloqueada.

Todo mundo vai entrar nela.
Na minha opinião, você tinha que ter bloqueado as páginas dentro de admin no caso.

Sobre o redirecionar para o login tem que colocar um access-denied-handler para redirecionar para a login.jsf

Acho que fica mais ou menos assim.

<intercept-url pattern="/admin/*.jsf" access=“access=“hasRole(‘ROLE_USER’)”” />

Tente dar uma olhada aí e muda o hasRole para o role do admin.

D

utilizar Spring Security com JSF é muito trabalhoso… vai funcionar… mas voce vai perder uns dias facil… recomendo voce ir atras de JAAS em um dia voce implementa tudo que queria fazer com o Spring Security…

L

Na verdade pelo que vi em uma reportagem eu até gostei, pois o spring security tem tags que dá para usar com jsf, por exemplo no rendered para não permitir que uma opção de menu apareça para uma pessoa que não seja de um nível x.

Mas não conheço muito a fundo para dizer que é bom ou ruim.

F

É verdade lele_vader, tem bastante coisa interessante, não só no Security, mas no Spring em sí também.
Mas o que o darklordkamui disse é verdade, até agora não consegui fazer funcionar.

Alguêm que conseguiu teria um exemplo?
Tá tenso =D

L

Qual erro ocorre ?

A

Fala !!

E uso um sistema em que implementei o spring Security para controle de acesso, ficou assim:

applicationContext.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="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.0.xsd"&gt;
	&lt;http&gt;

		
		&lt;intercept-url pattern="/restrito/**" access="ROLE_ADMINISTRADOR,ROLE_TECNICO,ROLE_GESTOR,ROLE_SOLICITANTE" /&gt;
		(acima temos a pasta restrito que será acessada de forma distinta por cada tipo de usuario listados no acess.)

		&lt;form-login login-page="/publico/login.jsf"(pasta publico onde está a página de login para autenticação)
			always-use-default-target="true" (se o acesso for validado como true o usuario entra no sistema se false uma mensagem
                         de erro e enviada a página de lógin com o authentication-failure-url)
		
			authentication-failure-url="/publico/login.jsf?login_error=1" /&gt;
		&lt;logout/&gt;
		&lt;remember-me /&gt;
	&lt;/http&gt;

&lt;authentication-manager&gt;
		&lt;authentication-provider&gt;...(sua autenticação de usuário)

O controle de permissão das funcionalidades do sistema eu fiz no menu de opções do PrimeFaces, utlizando a tag <sec:ifAnyGranted>

Menu.xhtml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui"
	xmlns:sec="http://www.springframework.org/security/facelets/tags"&gt;

&lt;ui:composition&gt;

	&lt;sec:ifAnyGranted roles="ROLE_ADMINISTRADOR, ROLE_TECNICO, ROLE_GESTOR, ROLE_SOLICITANTE"&gt;
                                              &lt;!-- aqui o menu e liberado para todos--&gt;

		&lt;h:form&gt;
			&lt;p:growl id="messages" /&gt;
         
        
			&lt;p:menubar autoDisplay="false"&gt;
				&lt;p:menuitem value="Principal" url="/restrito/home.jsf" icon="ui-icon ui-icon-home" /&gt;
				
				&lt;p:submenu label="Solicitação de Serviço"  icon="ui-icon ui-icon-folder-open"&gt; 
            		&lt;p:menuitem value="Listar S. de Serviço" url="/restrito/USSA/SS/listarSS.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;p:menuitem value="Nova S. de Serviço" action="#{ssosBean.novaSS}" icon="ui-icon ui-icon-extlink"/&gt;
        		&lt;/p:submenu&gt;
        		
        		&lt;sec:ifAnyGranted roles="ROLE_ADMINISTRADOR, ROLE_TECNICO, ROLE_GESTOR"&gt; &lt;!-- esta opção apenas tres usuários conseguiram visualizar --&gt;
        		&lt;p:submenu label="Usuário"  icon="ui-icon ui-icon-person"&gt; 
            		&lt;p:menuitem value="Empregados" url="/restrito/empregado/listarEmpregado.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;sec:ifAnyGranted roles="ROLE_ADMINISTRADOR, ROLE_TECNICO"&gt; &lt;!-- aqui somente dois usuários conseguiram visualizar as 3 opções dentro da tag --&gt;
            		&lt;p:menuitem value="Usuários" url="/admin/listarUsuario.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;p:menuitem value="Executor Interno" url="/restrito/executorInterno/listarExecutorInterno.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;p:menuitem value="Executor Externo" url="/restrito/USSA/executorExterno/listarExecutorExterno.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;/sec:ifAnyGranted&gt;
        		&lt;/p:submenu&gt;
        		&lt;/sec:ifAnyGranted&gt;
        		
        		&lt;sec:ifAnyGranted roles="ROLE_ADMINISTRADOR, ROLE_TECNICO"&gt; &lt;!-- aqui somente dois usuários conseguiram visualizar o submenu Serviços --&gt;
        		
        		&lt;p:submenu label="Serviços"  icon="ui-icon ui-icon-folder-open"&gt; 
            		&lt;p:menuitem value="Grupo de Serviço" url="/restrito/grupoServico/listarGrupoServico.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;p:menuitem value="Serviços Internos" url="/restrito/servicos/listarServico.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;p:menuitem value="Serviço Terceirizado" url="/restrito/USSA/terceirizada/listarTerceirizada.jsf" icon="ui-icon ui-icon-extlink"/&gt;
            		&lt;p:menuitem value="Custo de Serviços" url="/restrito/USSA/custoServico/listarCustoServico.jsf" icon="ui-icon ui-icon-extlink"/&gt;
        		&lt;/p:submenu&gt;
        		
        		&lt;/sec:ifAnyGranted&gt;
        		&lt;!-- aqui todos --&gt;
        		&lt;p:menuitem value="Minha Conta" url="/restrito/empregado/minhaConta.jsf" icon="ui-icon ui-icon-document" /&gt;
        		
			&lt;p:menuitem value="Sair" url="#{request.contextPath}/j_spring_security_logout" icon="ui-icon ui-icon-power" /&gt;
			&lt;/p:menubar&gt;
           
		&lt;/h:form&gt;

	&lt;/sec:ifAnyGranted&gt;
&lt;/ui:composition&gt;
&lt;/html&gt;

Permissão essa definida no login.

M

fer.ferreira6:
É verdade lele_vader, tem bastante coisa interessante, não só no Security, mas no Spring em sí também.
Mas o que o darklordkamui disse é verdade, até agora não consegui fazer funcionar.

Alguêm que conseguiu teria um exemplo?
Tá tenso =D

Notei que no seu applicationContext.xml você colocou todos os usuarios como desabilitados, veja:

&lt;authentication-manager&gt;  
        &lt;authentication-provider&gt;  
            &lt;jdbc-user-service data-source-ref="dataSource"  
                users-by-username-query="SELECT username, password, 'false' as enable &lt;--- FROM users WHERE username=?"  
                authorities-by-username-query="SELECT username, authority FROM users WHERE username=?" /&gt;  
        &lt;/authentication-provider&gt;  
&lt;/authentication-manager&gt;

Acredito eu que seja por isso que você não ta conseguindo fazer com que o usuario consiga fazer login no seu sistema.

Criado 12 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 7
Participantes 5