Невозможно получить принципал / аутентификацию при использовании сеанса + повторное сохранение - PullRequest
1 голос
/ 21 июня 2019

Я пытался выполнить Сеанс безопасности Micronaut и Сеанс Redis Micronaut , чтобы сессия и безопасность работали с постоянством Redis безуспешно.

Если яотключив постоянство Redis, я могу получить объект Principal, и пользователь аутентифицируется должным образом, но если я включаю постоянство Redis, я вижу, что пользователь аутентифицирован на данных Redis, однако я никогда не могу получить объект Principal и всегда возвращает ноль

Однако, когда я включаю персистентность Redis, я могу подтвердить, что все еще могу получить правильный объект Session, который правильно создан и прочитан из Redis (посетив конечную точку /anon, я могу видеть и аутентификацию, и значение идентификатора сеанса).Я не уверен, что я делаю не так

Вот мой application.yml файл

---
micronaut:
  application:
    name: hello-world
  security:
    enabled: true
    endpoints:
      login:
        enabled: true
      logout:
        enabled: true
    session:
      enabled: true
      login-success-target-url: /
      login-failure-target-url: /login/authFailed
  session:
    http:
      cookie-name: supahsexy
      cookie: true
      redis:
        enabled: true
        namespace: 'myapp:sessions'
        write-mode: BACKGROUND
        enable-keyspace-event: false
        value-serializer: io.micronaut.jackson.serialize.JacksonObjectSerializer
---
redis:
  uri: redis://localhost

И для AuthenticationProviderUserPassword.java

@Singleton
public class AuthenticationProviderUserPassword implements AuthenticationProvider {
    @Override
    public Publisher<AuthenticationResponse> authenticate(AuthenticationRequest authenticationRequest) {
        if (authenticationRequest.getIdentity().equals("admin") && authenticationRequest.getSecret().equals("admin")) {
            var ud = new UserDetails((String) authenticationRequest.getIdentity(), List.of());
            return Flowable.just(ud);
        }
        return Flowable.just(new AuthenticationFailed());
    }
}

Наконец-то этоконечные точки

@Controller("/")
public class HelloController {
    @Get("/")
    @Produces(MediaType.TEXT_PLAIN)
    @Secured(SecurityRule.IS_ANONYMOUS)
    public String index(Session session, @Nullable Principal principal) {
        System.out.println(principal);
        String username = principal != null? principal.getName() : "<anonymous>";
        session.put("session id", session.getId());
        return "Hello world " + username;
    }

    @Get("/blah")
    @Produces(MediaType.TEXT_PLAIN)
    @Secured(SecurityRule.IS_AUTHENTICATED)
    public String blah(Session session, @Nullable Principal principal) {
        System.out.println(session.asMap().toString());
        if (principal != null) {
            System.out.println(principal.getName());
        }
        return "Blah";
    }

    @Get("/anon")
    @Produces(MediaType.TEXT_PLAIN)
    @Secured(SecurityRule.IS_ANONYMOUS)
    public String anon(Session session) {

        return "Session = " + session.get("micronaut.AUTHENTICATION").orElse("no auth") + ", " + session.get("session id").orElse("no session id");
    }
}

1 Ответ

2 голосов
/ 26 июня 2019

Это была недавно исправленная ошибка https://github.com/micronaut-projects/micronaut-security/issues/47

...