Я пытался выполнить Сеанс безопасности 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");
}
}