Como verificar a autoridade ou permissão do usuário no código Java? Por exemplo - desejo mostrar ou ocultar o botão para o usuário, dependendo da função. Existem anotações como:
@PreAuthorize("hasRole('ROLE_USER')")
Como fazer em código Java? Algo como :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Piotr Gwiazda
fonte
fonte
SecurityContextHolderAwareRequestWrapper
instância. Você poderia melhorá-lo explicando como obtê-lo e esclarecendo um pouco mais a própria resposta.você pode usar o método isUserInRole do objeto HttpServletRequest.
algo como:
fonte
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
receber o pedido? :)Em vez de usar um loop para encontrar a autoridade de UserDetails, você pode fazer:
fonte
Você pode recuperar o contexto de segurança e usá-lo:
fonte
SecurityContextHolder.getContext()
é nuncaNULL
, verifique os documentos. Assim, você pode evitar a verificação do contextoNULL
.Você pode implementar um método hasRole () conforme abaixo - (testado no spring security 3.0.x não tenho certeza sobre outras versões).
fonte
SecurityContextHolder.getContext().getAuthentication()
pode recuperarnull
. Talvez você adicione algum cheque?Estou usando este:
fonte
Você pode obter ajuda na classe AuthorityUtils . Verificando a função de uma linha:
Advertência: isso não verifica a hierarquia de papéis, se houver.
fonte
A resposta de JoseK não pode ser usada quando você está em sua camada de serviço, onde você não deseja introduzir um acoplamento com a camada da web a partir da referência à solicitação HTTP. Se você está procurando resolver as funções enquanto estiver na camada de serviço, a resposta de Gopi é o caminho a percorrer.
No entanto, é um pouco prolixo. As autoridades podem ser acessadas diretamente da Autenticação. Portanto, se você pode presumir que tem um usuário conectado, o seguinte o fará:
fonte
A maioria das respostas não contém alguns pontos:
Papel e autoridade não são a mesma coisa na primavera. Veja aqui para mais detalhes.
Os nomes das funções são iguais a
rolePrefix
+authority
.O prefixo de função padrão é
ROLE_
, entretanto, configurável. Veja aqui .Portanto, uma verificação de função adequada precisa respeitar o prefixo da função, se estiver configurado.
Infelizmente, a personalização do prefixo de função no Spring é um pouco hacky, em muitos lugares o prefixo padrão,
ROLE_
é codificado, mas, além disso, um bean do tipoGrantedAuthorityDefaults
é verificado no contexto do Spring e, se existir, o prefixo de função personalizado é tem é respeitado.Reunindo todas essas informações, uma implementação melhor do verificador de função seria algo como:
fonte
Estranhamente, não acho que haja uma solução padrão para esse problema, já que o controle de acesso spring-security é baseado em expressão , não em java. você pode verificar o código-fonte de DefaultMethodSecurityExpressionHandler para ver se você pode reutilizar algo que eles estão fazendo lá
fonte
Melhor tarde do que nunca, deixe-me investir meu valor de 2 centavos.
No mundo JSF, dentro do meu bean gerenciado, fiz o seguinte:
Conforme mencionado acima, meu entendimento é que isso pode ser feito da maneira mais árdua da seguinte forma:
fonte
Esta é uma espécie de pergunta vinda do outro lado, mas pensei em jogar porque eu realmente tinha que cavar na internet para descobrir isso.
Há muitas coisas sobre como verificar papéis, mas não há muito que dizer o que você está realmente verificando quando diz hasRole ("blá")
HasRole verifica as autoridades concedidas para o principal atualmente autenticado
Então, realmente, quando você vê hasRole ("blah"), realmente significa hasAuthority ("blah") .
No caso que vi, você faz isso com uma classe que implementa UserDetails, que define um método chamado getAuthorities. Nisto, você basicamente adicionará alguns
new SimpleGrantedAuthority("some name")
a uma lista com base em alguma lógica. Os nomes nesta lista são os itens verificados pelas instruções hasRole.Acho que, neste contexto, o objeto UserDetails é o principal atualmente autenticado. Existe alguma mágica que acontece dentro e ao redor dos provedores de autenticação e, mais especificamente, do gerenciador de autenticação que faz isso acontecer.
fonte
hasRole("bla")
agora é igual ahasAuthority("ROLE_bla")
.A resposta @gouki é a melhor!
Apenas uma dica de como a primavera realmente faz isso.
Existe uma classe chamada
SecurityContextHolderAwareRequestWrapper
que implementa oServletRequestWrapper
classe.O
SecurityContextHolderAwareRequestWrapper
substitui oisUserInRole
usuário e searchAuthentication
(que é gerenciado pelo Spring) para descobrir se o usuário tem uma função ou não.SecurityContextHolderAwareRequestWrapper
o código é como:fonte
Essas duas anotações abaixo são iguais, "hasRole" adicionará automaticamente o prefixo "ROLE_". Certifique-se de ter a anotação correta. Esta função é definida em UserDetailsService # loadUserByUsername.
então, você pode obter a função no código java.
fonte
Em nosso projeto, estamos usando uma hierarquia de papéis, enquanto a maioria das respostas acima visa apenas a verificação de um papel específico, ou seja, verificaria apenas o papel fornecido, mas não para aquele papel e subir na hierarquia.
Uma solução para isso:
RoleHierarchy é definido como um bean em spring-security.xml.
fonte
Em seu modelo de usuário, basta adicionar um método 'hasRole' como abaixo
Eu geralmente uso para verificar se o usuário autenticado tem a função admin da seguinte maneira
fonte
As funções do usuário podem ser verificadas das seguintes maneiras:
Usando métodos estáticos de chamada em SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Usando HttpServletRequest
fonte
Minha abordagem com a ajuda de Java8, passando por papéis separados por vírgulas lhe dará verdadeiro ou falso
fonte