Gostaria de criar uma classe que adiciona métodos personalizados para uso em linguagem de expressão de segurança Spring para autorização baseada em método por meio de anotações.
Por exemplo, eu gostaria de criar um método personalizado como 'customMethodReturningBoolean' para ser usado de alguma forma assim:
@PreAuthorize("customMethodReturningBoolean()")
public void myMethodToSecure() {
// whatever
}
Minha pergunta é esta. Se for possível, qual classe devo criar como subclasse para criar meus métodos personalizados, como eu faria para configurá-lo nos arquivos de configuração xml do spring e vir alguém me dar um exemplo de um método personalizado usado dessa forma?
java
spring
spring-security
Paul D. Eden
fonte
fonte
Respostas:
Você precisará criar uma subclasse de duas classes.
Primeiro, defina um novo manipulador de expressão de método
myMethodSecurityExpressionHandler
será uma subclasse daDefaultMethodSecurityExpressionHandler
qual se sobrepõecreateEvaluationContext()
, definindo uma subclasse deMethodSecurityExpressionRoot
noMethodSecurityEvaluationContext
.Por exemplo:
fonte
MethodSecurityExpressionRoot
ser um pacote privado ?Nenhuma das técnicas mencionadas funcionará mais. Parece que o Spring fez um grande esforço para evitar que os usuários substituíssem o SecurityExpressionRoot.
EDITAR 19/11/2014 Configure o Spring para usar anotações de segurança:
Crie um bean como este:
Em seguida, faça algo assim em seu jsp:
Ou anote um método:
Além disso, você pode usar Spring Expression Language em suas
@PreAuthorize
anotações para acessar a autenticação atual, bem como argumentos de método.Por exemplo:
Em seguida, atualize seu
@PreAuthorize
para corresponder à nova assinatura de método:fonte
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
para obter o token de autenticação atual.Obrigado ericacm , mas não funciona por alguns motivos:
As diferenças são que chamamos o método createEvaluationContext existente e, em seguida, adicionamos nosso objeto raiz personalizado. Finalmente, acabei de retornar um tipo de objeto StandardEvaluationContext, já que MethodSecurityEvaluationContext não resolveria no compilador (ambos são da mesma interface). Este é o código que tenho agora em produção.
Faça MethodSecurityExpressionHandler usar nossa raiz personalizada:
Isso substitui a raiz padrão estendendo SecurityExpressionRoot . Aqui, renomeei hasRole para hasEntitlement:
Por fim, atualize o securityContext.xml (e certifique-se de que seja referenciado no seu applcationContext.xml):
Observação: a anotação @Secured não aceitará essa substituição, pois ela é executada por um manipulador de validação diferente. Portanto, no xml acima, desativei-os para evitar confusão posterior.
fonte