Pergunta

Eu estou usando Wicket com o Projeto Wicket Auth para minha camada de apresentação e, portanto, têm integrado com Primavera Segurança. Este é o método que é chamado por Wicket para autenticação para mim:

@Override
public boolean authenticate(String username, String password) {
    try {
        Authentication request = new UsernamePasswordAuthenticationToken(
                username, password);
        Authentication result = authenticationManager.authenticate(request);
        SecurityContextHolder.getContext().setAuthentication(result);
    } catch (AuthenticationException e) {
        return false;
    }
    return true;
}

O conteúdo (para dentro) de minha configuração XML do Spring Security são:

<http path-type="regex">
    <form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
    <password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>

A seção 2.3.6. Fixação de sessão Proteção Ataque da documentação de referência diz:

Sessão ataques de fixação são um risco potencial, onde é possível para um atacante malicioso para criar um sessão acessando um site, em seguida, persuadir outro usuário faça login com a mesma sessão (enviando-lhes um ligar contendo o identificador da sessão como um parâmetro, por exemplo). Primavera Security protege contra esta automaticamente através da criação de um novo sessão quando um usuário faz login. Se você não necessitam desta proteção, ou ele conflitos com alguma outra exigência, você pode controlar o comportamento usando a sessão de fixação-proteção atributo em, que tem três opções:

  • migrateSession - cria uma nova sessão e copia o existente atributos sessão para a nova sessão. Este é o padrão.
  • none - Não faça nada. A sessão original serão mantidas.
  • newSession - Criar uma nova sessão "limpa", sem copiar o dados sessão existente.

As obras de autenticação, mas como eu sou bastante novo para Spring Security Eu tenho algumas perguntas que eu precisam de respostas demasiado:

  • Normalmente para login, eu ia postar as informações de autenticação para j_spring_security_check e deixe Spring Security executar o código de autenticação real. Eu gostaria de ter proteção contra ataques de fixação de sessão, vou conseguir isso quando eu executar um login programático como eu faço? E se não, o que eu teria que fazer para obtê-lo?
  • Como eu faço o logout programático?
  • Como vou usar o login programático e logout, como faço para desativar a Primavera de interceptar os URL do?

Update: Para a sessão de proteção contra ataques de fixação parece que eu preciso chamar o método na classe SessionUtils com o startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry) assinatura.

Como faço para obter a instância SessionRegistry que eu preciso passar em? Não consigo encontrar alguma maneira de criar uma ID alias para isso, ou como obtê-lo de ID ou nome.

Foi útil?

Solução

Talvez não seja uma resposta completa às suas perguntas, mas talvez possa ajudá-lo.

O código a ser chamado quando você não usar o login programático, mas um padrão pode ser encontrada aqui:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

Eu acho que você estava inspirado por este em seu código. Parece bastante similar.

Da mesma forma o código executado quando você acessa o /j_spring_security_logout na abordagem padrão, pode ser encontrada aqui:

org.springframework.security.ui.logout.LogoutFilter

O LogoutFilter chama vários manipuladores. O manipulador que estamos usando é chamado: org.springframework.security.ui.logout.SecurityContextLogoutHandler, de modo que você pode chamar o mesmo código em sua abordagem.

Outras dicas

Você realmente será aberta a sessão de ataques fixações. Para remediar isso, você poderia voltar a ser "inspirado" pelo código de Primavera. Para criar uma nova sessão, obviamente, você vai precisar de acesso ao HttpSession para que você pode ter que fazer alguma refatoração.

Se você ver o método SessionUtils .startNewSessionIfRequired.

Isto irá migrar a autenticação para uma nova sessão. Você pode ser capaz de chamar esse método diretamente ou então apenas refatorar o código um pouco.

Como para o logout programático você não pode ir muito longe errado simplesmente chamando session.invalidate() quando você precisa registrar a pessoa para fora. Isto irá fazer tudo o necessário a partir de uma perspectiva de segurança geral, mas ter em mente que você pode precisar de limpeza algumas coisas sobre a sessão. Se você tem um conjunto muito complicado de filtros etc. e você precisa assegurar que o usuário está conectado para o resto do pedido, em seguida, você pode adicionar:

SecurityContextHolder.getContext().setAuthentication(null);

Como para interceptação da URL que você poderia apenas configurá-los para algo não utilizado e ignorá-lo! Eu não tenho certeza se você pode desligar a intercepção na configuração - se você realmente deseja removê-lo, em seguida, ter um olhar para o AuthenticationProcessingFilter - você pode personalizar este. Se você fizer isso, então você terá que configurar manualmente o xml de segurança primavera e não usar os namespaces fornecidos. Não é muito difícil embora - olhar para alguma documentação mais velha e você verá como fazer isso.

Espero que isso ajude!

1) Programático Sair

  1. chamada HttpServletRequest.getSession (false) .invalidate
  2. chamada SecurityContextHolder.clearContext ()

2) Diga Spring Security NÃO a determinadas URLs interceptar, este tipo de depende de como seu espaço de URL do aplicativo está configurado. Se todas as suas páginas (exceto / login e / logout) viveu no contexto / myApp então você poderia fazer isso:

<http ....>
  <intercept-url pattern="/myApp/**" ..>
 ....
</http>

Eu tive um problema com o login programático. Liguei para todos os métodos authenticationManager.authenticate(...) e SecurityContextHolder.getContext().setAuthentication(...) mas teve alguns problemas com a sessão. Eu tinha que adicione as seguintes linhas para gerir adequadamente a sessão:

HttpSession session = request.getSession();
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());

Este não era claro desde o código de exemplo postado acima. Para mais olhada http://forum.springsource.org/showthread.php?t=69761

Para fazer o logout programático também é possível lançar uma org.springframework.security.core.AuthenticationException. Por exemplo, SessionAuthenticationException. Neste caso ExceptionTranslationFilter iniciar o logout.

Você pode tentar este

    try {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        SecurityContextHolder.clearContext();

    } catch (Exception e) {
        logger.log(LogLevel.INFO, "Problem logging out.");
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top