Spring Security - Autenticação Executar como
1. Visão geral
Neste tutorial, ilustraremos como usar a autenticação Run-As no Spring Security com um cenário simples.
A explicação de alto nível sobre o Run-As é a seguinte: um usuário pode executar alguma parte da lógica como outra entidade com privilégios diferentes.
2. ORunAsManager
A primeira coisa que precisamos fazer é configurar nossoGlobalMethodSecuritye injetarRunAsManager.
Ele é responsável por fornecer ao objeto temporárioAuthentication privilégios extras:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected RunAsManager runAsManager() {
RunAsManagerImpl runAsManager = new RunAsManagerImpl();
runAsManager.setKey("MyRunAsKey");
return runAsManager;
}
}
SubstituindorunAsManager, estamos substituindo a implementação padrão na classe base - que simplesmente retorna umnull.
Observe também a propriedadekey - o framework usa isso para proteger / verificar objetos temporáriosAuthentication (criados por meio deste gerenciador).
Finalmente - o objetoAuthentication resultante é umRunAsUserToken. __
3. Configuração de segurança
Para autenticar nosso objeto temporárioAuthentication, vamos configurar umRunAsImplAuthenticationProvider:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
...
auth.authenticationProvider(runAsAuthenticationProvider());
}
@Bean
public AuthenticationProvider runAsAuthenticationProvider() {
RunAsImplAuthenticationProvider authProvider = new RunAsImplAuthenticationProvider();
authProvider.setKey("MyRunAsKey");
return authProvider;
}
É claro que estamos configurando isso com a mesma chave que usamos no gerenciador - para que o provedor possa verificar se o objeto de autenticaçãoRunAsUserToken foi criado usando a mesma chave.
4. O controlador com@Secured
Agora - vamos ver como usar a substituição da autenticação Run-As:
@Controller
@RequestMapping("/runas")
class RunAsController {
@Secured({ "ROLE_USER", "RUN_AS_REPORTER" })
@RequestMapping
@ResponseBody
public String tryRunAs() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
return "Current User Authorities inside this RunAS method only " +
auth.getAuthorities().toString();
}
}
O principal aqui é a nova função -RUN_AS_REPORTER. Esse é o gatilho da funcionalidade Executar como - pois a estrutura lida com ela de maneira diferente por causa do prefixo.
Quando uma solicitação é executada por meio dessa lógica, teremos:
-
As autoridades do usuário atual antes do métodotryRunAs() são [ROLE_USER]
-
As autoridades do usuário atual dentro do métodotryRunAs() são [ROLE_USER, ROLE_RUN_AS_REPORTER]
-
O objeto temporárioAuthentication substitui o objeto de autenticação existente apenas durante a invocação do métodotryRunAS()
5. O serviço
Finalmente, vamos implementar a lógica real - uma camada de serviço simples que também é protegida:
@Service
public class RunAsService {
@Secured({ "ROLE_RUN_AS_REPORTER" })
public Authentication getCurrentUser() {
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
return authentication;
}
}
Observe que:
-
Para acessar o métodogetCurrentUser(), precisamosROLE_RUN_AS_REPORTER
-
Portanto, só podemos chamar o métodogetCurrentUser() dentro de nosso método de controladortryRunAs()
6. O Front-End
Em seguida, usaremos um front-end simples para testar nosso recurso Executar como:
Current user authorities:
user
Generate Report As Super User
Então, agora, quando um usuário dispara a ação “Generate Report As Super User” - ele obterá a autoridade temporáriaROLE_RUN_AS_REPORTER.
7. Conclusão
Neste tutorial rápido, exploramos um exemplo simples usando o recurso Spring SecurityRun-As authentication replacement.
Este tutorial é baseado emcodebase available on GitHub.