[RESOLVIDO] Spring Security - Atualizar Authorities / Permissões
4 respostas
O
oilujaguiar
Olá Pessoal!
Recentemente implementamos a segurança de um sistema (JSF + Primefaces) utilizando o spring security…
O sistema está funcionando perfeitamente, porém quando fazemos atualização de alguma ROLE/Permissões do usuário, até onde percebemos, o spring não interpreta está alteração em tempo de execução…
Diante do exposto pergunto-lhes…
Temos como fazer com que o spring atualize sua SQL / regras em tempo de execução ? Desta forma quando o usuário efetuasse a próxima requisição no servidor ele faria o Refresh das permissões…
Primeiramente qual a configuração que você esta usando?
Me antecipando eu sugiro a seguinte configuração para o seu Spring Security, desta forma você tem o controle da validação e assim fica mais facil customizar sem depender do comportamento padrão do Spring, segue:
Após esta configuração do contexto você pode fazer a implementação do seu provider, que seria algo assim:
@ComponentpublicclassMyAuthenticationProviderextendsAbstractUserDetailsAuthenticationProvider{@AutowiredprivateClientServiceclientService;@OverrideprotectedvoidadditionalAuthenticationChecks(UserDetailsuserDetails,UsernamePasswordAuthenticationTokenauthentication)throwsAuthenticationException{}@OverrideprotectedUserDetailsretrieveUser(Stringusername,UsernamePasswordAuthenticationTokenauthentication){Stringpassword=(String)authentication.getCredentials();if(!StringUtils.hasText(password)){thrownewBadCredentialsException("Entre com a senha por favor");}Clientclient=this.clientService.findByUsenameAndPassword(newClient(username,password));if(this.client==null){thrownewBadCredentialsException("Usuário invalido!");}authentication.setDetails(client);List<String>rolesForThisClient=clientService.findAllRoles(client);List<GrantedAuthority>authorities=newArrayList<GrantedAuthority>();foreach(StringroleinrolesForThisClient){authorities.add(newGrantedAuthorityImpl(role));}returnnewUser(username,password,true,true,true,true,authorities);}}
É isso ai, se você enviar suas configurações ficará mais facil encontrar uma solução.
abraço!
O
oilujaguiar
Olá mmaico,
Hoje está com a seguinte config:
-<b:beansxmlns="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"><httpauto-config="true"access-denied-page="/publico/acessoNegado.xhtml"><intercept-urlpattern="/restrito/**"access="ROLE_TESTE"/><form-loginlogin-page="/publico/login.xhtml"always-use-default-target="true"default-target-url="/restrito/index.xhtml"authentication-failure-url="/publico/index.xhtml?login_error=1"/><logoutinvalidate-session="true"/><remember-me/></http><authentication-manager><authentication-provider><jdbc-user-servicedata-source-ref="financeiroDataSource"authorities-by-username-query="SELECT login, role FROM permissoes where login=?;"users-by-username-query="SELECT login, senha, status FROM login where login = ?"/></authentication-provider></authentication-manager></b:beans>
Você acha que se alterar o contexto para seu exemplo ele ira atualizar as permissões em tempo de execução ? Queremos que as modificações efetuadas no perfil reflitam a medida que o perfil de acesso for “atualizado”…
Abs.
M
mmaico
Olá,
Tanto a sua abordagem quando a minha terá o mesmo efeito, só muda a forma.
O Spring Security irá executar essa rotina somente uma vez, que é quando o usuário se autentica no sistema, após isso ele não irá mais chamar sua rotina no DB, nem o provider no meu exemplo.
Quando você altera as pemissões do usuário isso só será refletido no próximo login.
Pelo que persebi o próximo login do usuário não é o suficiente, então o que se pode fazer é o seguinte:
1-Crieuminterceptorqueiráatuarem/*menosauridelogin,ousejatodasasrequisições.2-Paracadarequisiçãovejanobancosehouveateração(selectqualquercoisa),useSecurityContextHolder.getContext().getPrincipal()parasaberqueméousuáriodarequisição.3-UsenometododoseuinterceptorSecurityContextHolder.getContext().getAuthorities().add(newGrantedAuthorityImpl("NovaRoleQueFoiAdicionada"))4-Pararemove segue o mesmo esquema SecurityContextHolder.getContext().getAuthorities().remove(new GrantedAuthorityImpl("RoleQueFoiRemovida"))
Espero ter ajudado.
Abraço!
O
oilujaguiar
Olá Mmaico
Achei que o Spring tivesse “nativo” esta configuração, mas tentarei implementar sua solcuação…