Spring Security - Autenticação Executar como

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.