Spring Security Expressions - Exemplo de hasRole
1. Visão geral
Spring Security fornece uma grande variedade de Expressões, usando a poderosa Spring Expression Language (SpEL). A maioria dessas expressões de segurança é avaliada em relação a um objeto contextual -the currently authenticated principal.
A avaliação dessas expressões é realizada porSecurityExpressionRoot - que fornece a base para a segurança da web e também para a segurança em nível de método.
A capacidade de usar expressõesSpEL como um mecanismo de autorização foi introduzida no Spring Security 3.0 e continua no Spring Security 4.x. Para uma lista abrangente de expressões no Spring Security, dê uma olhada emthis guide.
Leitura adicional:
Segurança de primavera com Thymeleaf
Um guia rápido para integrar Spring Security e Thymeleaf
Introdução à Spring Method Security
Um guia para segurança em nível de método usando a estrutura Spring Security.
Autenticação de dois fatores com segurança de mola
Uma implementação prática de autenticação de dois fatores com o Spring Security 4 e o aplicativo móvel Google Authenticator.
2. Autorização da Web
O Spring Security fornece dois tipos de autorização da web - protegendo afull page based on the URLe mostrando condicionalmenteparts of a JSP page com base nas regras de segurança.
2.1. Exemplo de autorização de página inteira
Com as expressões ativadas para o elementohttp, um padrão de URL pode ser protegido da seguinte maneira:
...
Usando a configuração Java:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN");
}
...
}
Spring Security automaticamente prefixa qualquer função comROLE_.
A expressãohasRole é usada aqui para verificar se o principal autenticado atualmente tem a autoridade especificada.
2.2. Exemplo de autorização na página
O segundo tipo de autorização da Web está mostrando condicionalmente parte de uma página JSP com base na avaliação de uma expressão de segurança.
Vamos adicionar odependency necessário paraSpring Security JSP taglib support empom.xml:
org.springframework.security
spring-security-taglibs
5.0.5.RELEASE
O suportetaglib deve ser habilitado na página para usar o namespacesecurity:
<%@ taglib prefix="security"
uri="http://www.springframework.org/security/tags" %>
A expressãohasRole agora pode ser usada na página, para mostrar / ocultar elementos HTML com base em quem está autenticado no momento quando a página é processada:
This text is only visible to a user
This text is only visible to an admin
3. Exemplo de autorização de nível de método -@PreAuthorize
As Expressões de segurança podem ser usadas para proteger a funcionalidade comercial também no nível do método, usando anotações.
As anotações@PreAuthorize e@PostAuthorize (bem como@PreFiltere@PostFilter) suportam Spring Expression Language (SpEL) e fornecem controle de acesso baseado em expressão.
Primeiro, para usar a segurança de nível de método, precisamos habilitá-la na configuração de segurança usando@EnableGlobalMethodSecurity:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
}
A configuração XML equivalente:
Então, podemos proteger os métodos usando a anotação Spring@PreAuthorize:
@Service
public class FooService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public List findAll() { ... }
...
}
Agora, apenas os principais com a função ADMIN poderão chamar o métodofindAll com sucesso.
Observe quethe Pre and Post annotations are evaluated and enforced via proxies - no caso de proxies CGLIB serem usados, a classe e os métodos públicos não devem ser declarados comofinal.
4. Verificação programática da função
Uma autoridade de usuário também pode ser verificada programaticamente, em código Java bruto, se o objetorequest estiver disponível:
@RequestMapping
public void someControllerMethod(HttpServletRequest request) {
request.isUserInRole("someAuthority");
}
E, claro, sem acesso arequest, a verificação também pode ser feita manualmente, simplesmente verificando se o usuário autenticado no momento tem essa autoridade específica. The user can be obtained do contexto do Spring Security de várias maneiras.
5. Conclusão
Este tutorial é uma introdução rápida ao uso de Expressões Spring Security em geral, e a expressãohasRole em particular - como uma introdução rápida de como várias partes do aplicativo podem ser protegidas.
Para o exemplo de autorização da web, verifiquethis Github simple tutorial. O exemplo de segurança de nível de método também éon GitHub.