Micronaut框架/已登录但未经授权

时间:2018-11-08 15:55:26

标签: micronaut

我的micronaut应用程序遇到问题。 如果我要访问“ / index”,则必须登录。 登录后,正确显示“ / index”页面。 此时此刻,如果我想访问“ / periods / list / my”,我会重定向到 “ unauthorized-target-url”

最奇怪的是访问'/ index'仍然可以... 这可能是安全配置问题吗?

HomeController.java

@Secured(SecurityRule.IS_ANONYMOUS)
@Controller("/")
public class HomeController {
    @Get("/")
    @View("index")
    @Secured(SecurityRule.IS_AUTHENTICATED)
    Map<String, Object> index(@Nullable Principal principal) {
       ...
    }
}

PeriodController.java

@Controller("/periods")
@Secured(SecurityRule.IS_ANONYMOUS)
public class PeriodController {
    @Get("/list/my")
    @View("periods/my")
    @Secured(SecurityRule.IS_AUTHENTICATED)
    Map<String, Object> myPeriods(@Nullable Principal principal) {
        ...
    }
}

application.yml

micronaut:
    application:
        name: ws
    security:
        enabled: true
        endpoints:
            login:
                enabled: true 
            logout:
                enabled: true
                path: '/logout'
        interceptUrlMap:
            -
                pattern: /public/**
                httpMethod: GET
                access:
                    - isAnonymous()
        session:
            enabled: true 
            login-success-target-url: '/'
            login-failure-target-url: '/login/authFailed'
            logout-target-url: '/'
            unauthorized-target-url: '/unauthorized'
            forbidden-target-url: '/forbidden'
    session:
        http:
            cookie: true
            header: false

日志

11:47:20.134 [nioEventLoopGroup-1-4] DEBUG i.m.h.server.netty.NettyHttpServer - Server localhost:8080 Received Request: GET /periods/list/my
11:47:20.134 [nioEventLoopGroup-1-4] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Matching route GET - /periods/list/my
11:47:20.134 [nioEventLoopGroup-1-4] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Matched route GET - /periods/list/my to controller class com.gvhr.controllers.PeriodController
11:47:20.135 [pool-1-thread-4] DEBUG i.m.s.t.reader.HttpHeaderTokenReader - Looking for bearer token in Authorization header
11:47:20.135 [pool-1-thread-4] DEBUG i.m.s.t.TokenAuthenticationFetcher - Unauthenticated request GET, /periods/list/my, no token found.
11:47:20.135 [pool-1-thread-4] DEBUG i.m.security.filters.SecurityFilter - Failure to authenticate request. GET /periods/list/my.
11:47:20.135 [pool-1-thread-4] DEBUG i.m.security.filters.SecurityFilter - Unauthorized request GET /periods/list/my. The rule provider io.micronaut.security.rules.SecuredAnnotationRule rejected the request.
11:47:20.149 [nioEventLoopGroup-1-5] DEBUG i.m.h.server.netty.NettyHttpServer - Server localhost:8080 Received Request: GET /unauthorized
11:47:20.149 [nioEventLoopGroup-1-5] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Matching route GET - /unauthorized
11:47:20.149 [nioEventLoopGroup-1-5] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Matched route GET - /unauthorized to controller class com.gvhr.controllers.HomeController

2 个答案:

答案 0 :(得分:1)

我不知道这是否是您问题的根本原因,但是我有类似的症状。 Cookie的使用无法预测。有时,cookie会在一个路径上工作,然后在另一个路径上失败。非常随机。

我发现了问题:每个页面/路径都发送回具有不同路径的cookie。这意味着页面“ /”和“ / test”每个都有一个cookie。当您重新访问页面时,浏览器将为页面“ /”发送一个cookie,但为“ / test”发送两个cookie。

此修复程序在您的 application.yml 中,确保已设置 cookiePath

micronaut:
  session:
    http:
      cookiePath: /

这会强制整个服务器使用一个SESSION cookie。

当我记录更改请求时,我可能会对此进行更新。

我还替换了(@Replaces)两个Micronaut Bean:SessionSecurityfilterRejectionHandler和SessionLoginHandler,以支持登录后自动重定向到原始页面。

我感到Micronaut尚未专注于HTML /用户交互:)。

答案 1 :(得分:0)

此问题已在Micronaut 1.1.1版中修复